Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk mencipta indeks pasangan unik untuk Mongodb?

Bagaimana untuk mencipta indeks pasangan unik untuk Mongodb?

PHPz
PHPzke hadapan
2024-02-10 17:00:101115semak imbas

Bagaimana untuk mencipta indeks pasangan unik untuk Mongodb?

editor php Xigua akan memperkenalkan anda cara membuat indeks pasangan unik untuk Mongodb. Mongodb ialah pangkalan data bukan perhubungan, dan indeks pasangan ialah jenis indeks khas yang digunakan untuk memastikan keunikan pasangan dokumen dalam koleksi. Untuk mencipta indeks pasangan yang unik, anda perlu menggunakan kaedah createIndex Mongodb dan menentukan medan indeks serta pilihan keunikan. Dengan menetapkan indeks dengan betul, anda boleh mengelakkan pemasukan data pendua dengan berkesan dan meningkatkan ketekalan dan ketepatan data. Seterusnya, mari kita lihat langkah-langkah khusus!

Kandungan soalan

Saya menggunakan mongodb dan saya mahu menjadikan pasangan unik pada 2 medan.

Ini yang saya lakukan setakat ini:

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
}

Tapi bila dah selit 2 rekod macam ni

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

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

Hanya 1 rekod dalam pangkalan data

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

Yang kedua dah cover yang pertama

Di bawah adalah contoh kod saya untuk memasukkan rekod

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

Penyelesaian

Saya harus menguruskan senario anda. Izinkan saya berkongsi program mudah untuk menunjukkan apa yang saya capai.

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

Sekarang saya akan pergi ke semua langkah utama:

  1. object 结构的定义,这是您需要的简化版本。请注意实际使用的 bson 注释。为了这个演示,您可以安全地省略 json .
  2. Tetapan yang berkaitan dengan ekosistem mongo:
    1. Penciptaan konteks (dengan tamat masa)
    2. Persediaan pelanggan (sambung ke instance mongodb tempatan yang berjalan melalui docker)
    3. Buat koleksi bernama demodb 的数据库和名为 mycollection. Juga, saya menangguhkan panggilan untuk memadam ini apabila keluar dari program (hanya untuk membersihkan).
  3. Isytiharkan keunikan indeks dalam kaedah object_idobject_type 上创建唯一复合索引。请注意 options 字段,该字段使用 setunique medan.
  4. Tambah dokumentasi. Sila ambil perhatian bahawa program ini tidak membenarkan anda memasukkan dua dokumen dengan medan yang sama. Anda boleh cuba mengulas/menyahulas kes ini untuk mengesahkan sekali lagi.
  5. Untuk tujuan penyahpepijatan, saya akhirnya menyenaraikan dokumen dalam koleksi untuk menyemak sama ada dokumen kedua telah ditambahkan.

Saya harap demo ini menjawab beberapa soalan anda. Beritahu saya dan terima kasih!

Atas ialah kandungan terperinci Bagaimana untuk mencipta indeks pasangan unik untuk Mongodb?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam