Maison  >  Article  >  développement back-end  >  Comment créer un index de paire unique pour Mongodb ?

Comment créer un index de paire unique pour Mongodb ?

PHPz
PHPzavant
2024-02-10 17:00:101073parcourir

Comment créer un index de paire unique pour Mongodb ?

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 !

Contenu de la question

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)

Solution

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 :

  1. object 结构的定义,这是您需要的简化版本。请注意实际使用的 bson 注释。为了这个演示,您可以安全地省略 json .
  2. Paramètres liés à l'écosystème mongo :
    1. Création de contexte (avec timeout)
    2. Configuration du client (connexion à l'instance mongodb locale exécutée via Docker)
    3. Créez une collection nommée demodb 的数据库和名为 mycollection. De plus, je reporte l'appel pour les supprimer en quittant le programme (juste pour faire le ménage).
  3. Déclarez l'unicité de l'index dans la méthode field object_idobject_type 上创建唯一复合索引。请注意 options 字段,该字段使用 setunique.
  4. Ajouter de la documentation. Veuillez noter que le programme ne vous permet pas d'insérer deux documents avec les mêmes champs. Vous pouvez essayer de commenter/décommenter ces cas pour confirmer à nouveau.
  5. À des fins de débogage, j'ai fini par lister les documents de la collection pour vérifier si le deuxième document avait été ajouté.

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer