Files
mongo/main_index.go
George Suntres 38265c15d1 Initial import
2026-03-29 11:38:57 -04:00

76 lines
1.8 KiB
Go

package mongo
import (
"context"
"log"
"go.mongodb.org/mongo-driver/v2/mongo"
"go.mongodb.org/mongo-driver/v2/mongo/options"
"go.mongodb.org/mongo-driver/v2/bson"
)
// CreateIndexes will create indexes for the given collection and definition.
func (c *MongoClient) CreateIndexes(collection *mongo.Collection, cdef *CollectionDefinition) {
if cdef == nil {
log.Printf("No definitions will not create indexes")
return
}
// handle indexes
indexModels := make([]mongo.IndexModel, 0)
for _, keyDef := range cdef.IndexSpecs {
log.Printf("Key Definition %s", keyDef["name"])
kdb, err := bson.Marshal(keyDef)
if err != nil {
log.Printf("failed to marshal %v", err)
continue
}
kdRaw := bson.Raw(kdb)
if err := kdRaw.Validate(); err != nil {
log.Printf("failed to validate bson raw: %v", err)
continue
}
//
idxModel := mongo.IndexModel{}
opts := options.Index()
keysVal := kdRaw.Lookup("keys")
var keysBson bson.D
if err := bson.Unmarshal(keysVal.Value, &keysBson); err != nil {
log.Printf("failed to unmarshal keys value %v", err)
continue
}
idxModel.Keys = keysBson
nameVal := kdRaw.Lookup("name")
if name, ok := nameVal.StringValueOK(); ok {
opts = opts.SetName(name)
}
uniqueVal := kdRaw.Lookup("unique")
if unique, ok := uniqueVal.BooleanOK(); ok {
opts = opts.SetUnique(unique)
}
partialVal := kdRaw.Lookup("partialFilterExpression")
if partialFilterExpression, ok := partialVal.BooleanOK(); ok {
opts = opts.SetPartialFilterExpression(partialFilterExpression)
}
idxModel.Options = opts
indexModels = append(indexModels, idxModel)
}
collection.Indexes().CreateMany(context.Background(), indexModels)
}