Maison > développement back-end > Golang > le corps du texte

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

PHPz
Libérer: 2024-02-10 17:00:10
avant
1072 Les gens l'ont consulté

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
}
Copier après la connexion

Mais quand j'insère 2 enregistrements comme celui-ci

{
    "object_id"  : "abc",
    "object_type": "sample" 
}

{
    "object_id"  : "edf",
    "object_type": "sample" 
}
Copier après la connexion

Un seul enregistrement dans la base de données

{
    "object_id"  : "edf",
    "object_type": "sample" 
}
Copier après la connexion

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)
Copier après la connexion

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)
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!