Bagaimana untuk mencipta indeks pasangan unik untuk Mongodb?

PHPz
Lepaskan: 2024-02-10 17:00:10
ke hadapan
1073 orang telah melayarinya

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
}
Salin selepas log masuk

Tapi bila dah selit 2 rekod macam ni

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

{
    "object_id"  : "edf",
    "object_type": "sample" 
}
Salin selepas log masuk

Hanya 1 rekod dalam pangkalan data

{
    "object_id"  : "edf",
    "object_type": "sample" 
}
Salin selepas log masuk

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)
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!