Files
mongo/main_views.go
2026-04-17 11:38:12 -04:00

91 lines
1.9 KiB
Go

package mongo
import (
"context"
"log"
// "runtime"
"go.mongodb.org/mongo-driver/v2/mongo"
"go.mongodb.org/mongo-driver/v2/mongo/options"
"go.mongodb.org/mongo-driver/v2/bson"
)
// CreateViews will create views for the given collection and definition.
func (c *MongoClient) CreateViews(db *mongo.Database, cdef *CollectionDefinition) {
if cdef == nil || cdef.Views == nil {
log.Printf("No definition for views found.")
return
}
// runtime.Breakpoint()
for name, defVal := range cdef.Views {
// 1. Decode definition
v, err := bson.Marshal(defVal)
if err != nil {
log.Printf("failed to marshal %v", err)
continue
}
// 2. Take the raw representation
vRaw := bson.Raw(v)
if err := vRaw.Validate(); err != nil {
log.Printf("failed to validate bson raw: %v", err)
continue
}
pipelineVal := vRaw.Lookup("pipeline")
pipelineArr, ok := pipelineVal.ArrayOK()
if !ok {
log.Printf("Unable to extract pipeline")
continue
}
pipeline := mongo.Pipeline{}
successPipeline := true
pipelineValues, _ := pipelineArr.Values()
for _, o := range pipelineValues {
var stage bson.D
if err := bson.Unmarshal(o.Value, &stage); err != nil {
log.Printf("failed to unmarshal stage %v, %v", o, err)
successPipeline = false
break
}
pipeline = append(pipeline, stage)
}
if successPipeline == false {
continue
}
// Specify the Collation option to set a default collation for the view.
opts := options.CreateView().SetCollation(&options.Collation{
Locale: "en_US",
})
viewonVal := vRaw.Lookup("viewOn")
viewOn, ok := viewonVal.StringValueOK();
if !ok {
log.Printf("failed to find viewOn")
continue
}
err = db.CreateView(context.TODO(), name, viewOn, pipeline, opts)
if err != nil {
log.Printf("failed to create view %v", err)
continue
}
}
}