Heim >Backend-Entwicklung >Golang >Wie erstelle ich einen eindeutigen Paarindex für Mongodb?

Wie erstelle ich einen eindeutigen Paarindex für Mongodb?

PHPz
PHPznach vorne
2024-02-10 17:00:101116Durchsuche

Wie erstelle ich einen eindeutigen Paarindex für Mongodb?

php-Editor Xigua stellt Ihnen vor, wie Sie einen eindeutigen Paarindex für Mongodb erstellen. Mongodb ist eine nicht relationale Datenbank und der Paarindex ist ein spezieller Indextyp, der verwendet wird, um die Eindeutigkeit von Dokumentpaaren in der Sammlung sicherzustellen. Um einen eindeutigen Paarindex zu erstellen, müssen Sie die Methode createIndex von Mongodb verwenden und die Felder des Index sowie die Eindeutigkeitsoption angeben. Durch die korrekte Einstellung von Indizes können Sie das Einfügen doppelter Daten effektiv vermeiden und die Datenkonsistenz und -genauigkeit verbessern. Schauen wir uns als Nächstes die konkreten Schritte an!

Frageninhalt

Ich verwende Mongodb und möchte ein Paar in zwei Feldern eindeutig machen.

Das habe ich bisher gemacht:

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
}

Aber wenn ich 2 Datensätze so einfüge

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

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

Nur 1 Datensatz in der Datenbank

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

Der zweite hat den ersten abgedeckt

Unten finden Sie meinen Beispielcode zum Einfügen von Datensätzen

TranslationForm := entity.TranslationForm{
        ObjectID:       "ABC",
        ObjectType:     "SAMPLE",
        SourceLanguage: "en",
        TargetLanguage: "cn",
        Content:        "something",
        ExpireAt:       time.Now(),
    }
res, err := repository.collection.InsertOne(context.TODO(), TranslationForm)

Lösung

Ich sollte Ihr Szenario verwalten. Lassen Sie mich ein einfaches Programm vorstellen, um zu zeigen, was ich erreicht habe.

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)
}

Jetzt gehe ich alle wichtigen Schritte durch:

  1. object 结构的定义,这是您需要的简化版本。请注意实际使用的 bson 注释。为了这个演示,您可以安全地省略 json .
  2. Einstellungen im Zusammenhang mit dem Mongo-Ökosystem:
    1. Kontexterstellung (mit Timeout)
    2. Client-Setup (Verbindung zur lokalen Mongodb-Instanz herstellen, die über Docker ausgeführt wird)
    3. Erstellen Sie eine Sammlung mit dem Namen demodb 的数据库和名为 mycollection. Außerdem verschiebe ich den Aufruf, diese zu löschen, wenn ich das Programm beende (nur um aufzuräumen).
  3. Deklarieren Sie die Eindeutigkeit des Index in der Feldmethode object_idobject_type 上创建唯一复合索引。请注意 options 字段,该字段使用 setunique.
  4. Dokumentation hinzufügen. Bitte beachten Sie, dass das Programm das Einfügen von zwei Dokumenten mit denselben Feldern nicht zulässt. Sie können versuchen, diese Fälle zu kommentieren bzw. die Kommentare zu entfernen, um sie erneut zu bestätigen.
  5. Zu Debugging-Zwecken habe ich schließlich die Dokumente in der Sammlung aufgelistet, um zu überprüfen, ob das zweite Dokument hinzugefügt wurde.

Ich hoffe, diese Demo hat einige Ihrer Fragen beantwortet. Lass es mich wissen und danke!

Das obige ist der detaillierte Inhalt vonWie erstelle ich einen eindeutigen Paarindex für Mongodb?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen