L'éditeur php Xigua vous présentera comment créer un index de paire unique pour Mongodb. Mongodb est une base de données non relationnelle et l'index de paire est un type d'index spécial utilisé pour garantir l'unicité des paires de documents dans la collection. Pour créer un index de paire unique, vous devez utiliser la méthode createIndex de Mongodb et spécifier les champs de l'index ainsi que l'option d'unicité. En définissant correctement les index, vous pouvez efficacement éviter l'insertion de données en double et améliorer la cohérence et la précision des données. Voyons ensuite les étapes spécifiques !
J'utilise mongodb et je souhaite rendre une paire unique sur 2 champs.
Voici ce que j'ai fait jusqu'à présent :
func (repository *translationrepository) createindexes(collection *mongo.collection) error { models := []mongo.indexmodel{ { keys: bson.d{{"object_id", 1}, {"object_type", 1}}, options: options.index().setunique(true), }, { keys: bson.d{{"expire_at", 1}}, options: options.index().setexpireafterseconds(0), }, } opts := options.createindexes().setmaxtime(10 * time.second) _, err := collection.indexes().createmany(context.background(), models, opts) return err }
Mais quand j'insère 2 enregistrements comme celui-ci
{ "object_id" : "abc", "object_type": "sample" } { "object_id" : "edf", "object_type": "sample" }
Un seul enregistrement dans la base de données
{ "object_id" : "edf", "object_type": "sample" }
Le deuxième a couvert le premier
Vous trouverez ci-dessous mon exemple de code pour insérer des enregistrements
TranslationForm := entity.TranslationForm{ ObjectID: "ABC", ObjectType: "SAMPLE", SourceLanguage: "en", TargetLanguage: "cn", Content: "something", ExpireAt: time.Now(), } res, err := repository.collection.InsertOne(context.TODO(), TranslationForm)
Je devrais gérer ton scénario. Permettez-moi de partager un programme simple pour montrer ce que j'ai réalisé.
package main import ( "context" "fmt" "time" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) type Object struct { ObjectId string `json:"object_id" bson:"object_id"` ObjectType string `json:"object_type" bson:"object_type"` } func main() { ctx, cancelFunc := context.WithTimeout(context.Background(), time.Second*10) defer cancelFunc() clientOptions := options.Client().ApplyURI("mongodb://root:root@localhost:27017") mongoClient, err := mongo.Connect(ctx, clientOptions) if err != nil { panic(err) } defer mongoClient.Disconnect(ctx) demoDb := mongoClient.Database("demodb") defer demoDb.Drop(ctx) myCollection := demoDb.Collection("myCollection") defer myCollection.Drop(ctx) // create index indexModel := mongo.IndexModel{ Keys: bson.D{ bson.E{ Key: "object_id", Value: 1, }, bson.E{ Key: "object_type", Value: 1, }, }, Options: options.Index().SetUnique(true), } idxName, err := myCollection.Indexes().CreateOne(ctx, indexModel) if err != nil { panic(err) } fmt.Println("index name:", idxName) // delete documents defer func() { if _, err := myCollection.DeleteMany(ctx, bson.M{}); err != nil { panic(err) } }() // insert first doc res, err := myCollection.InsertOne(ctx, Object{ObjectId: "abc", ObjectType: "SAMPLE"}) if err != nil { panic(err) } fmt.Println(res.InsertedID) // insert second doc // res, err = myCollection.InsertOne(ctx, Object{ObjectId: "abc", ObjectType: "SAMPLE"}) => ERROR res, err = myCollection.InsertOne(ctx, Object{ObjectId: "def", ObjectType: "SAMPLE"}) // => OK! if err != nil { panic(err) } fmt.Println(res.InsertedID) // list all docs var objects []Object cursor, err := myCollection.Find(ctx, bson.M{}) if err != nil { panic(err) } if err = cursor.All(ctx, &objects); err != nil { panic(err) } fmt.Println(objects) }
Je vais maintenant passer en revue toutes les étapes principales :
object
结构的定义,这是您需要的简化版本。请注意实际使用的 bson
注释。为了这个演示,您可以安全地省略 json
. demodb
的数据库和名为 mycollection
. De plus, je reporte l'appel pour les supprimer en quittant le programme (juste pour faire le ménage). object_id
和 object_type
上创建唯一复合索引。请注意 options
字段,该字段使用 setunique
. J'espère que cette démo a répondu à certaines de vos questions. Faites-le-moi savoir et merci!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!