82 lines
2.0 KiB
Go
82 lines
2.0 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]%s", cdef.Name, 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, %v", keysVal, 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 partialVal.Type == bson.TypeEmbeddedDocument {
|
|
var partialFilterExpression bson.M
|
|
if err := bson.Unmarshal(partialVal.Value, &partialFilterExpression); err != nil {
|
|
log.Printf("failed to unmarshal partial filter: %v", err)
|
|
}
|
|
|
|
opts = opts.SetPartialFilterExpression(partialFilterExpression)
|
|
}
|
|
|
|
idxModel.Options = opts
|
|
|
|
indexModels = append(indexModels, idxModel)
|
|
}
|
|
|
|
collection.Indexes().CreateMany(context.Background(), indexModels)
|
|
}
|