Rumah > pembangunan bahagian belakang > tutorial php > Mengapa Saya Mendapat Dokumen Pendua dalam Koleksi MongoDB Saya Walaupun Selepas Mencipta Kunci Unik dengan `dropDups`?

Mengapa Saya Mendapat Dokumen Pendua dalam Koleksi MongoDB Saya Walaupun Selepas Mencipta Kunci Unik dengan `dropDups`?

DDD
Lepaskan: 2024-11-04 07:10:31
asal
1155 orang telah melayarinya

Why Am I Getting Duplicate Documents in My MongoDB Collection Even After Creating a Unique Key with `dropDups`?

Dokumen Pendua MongoDB Selepas Menambah Kunci Unik

Pernyataan Masalah

Walaupun mencipta koleksi dengan kunci unik pada " medan uid" dan "sid", dokumen pendua masih dimasukkan ke dalam koleksi.

Butiran Teknikal

Arahan penciptaan indeks yang digunakan:

db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true,dropDups: true})
Salin selepas log masuk

Sebab

Penciptaan indeks gagal kerana kehadiran dokumen pendua dalam koleksi. Dalam MongoDB versi 3.0.0, pilihan "dropDups" tidak berfungsi dengan betul, mengakibatkan isu ini.

Penyelesaian

  • Alih keluar dokumen pendua : Untuk menyelesaikan masalah ini, alih keluar dokumen pendua sebelum mencipta indeks unik. Ini boleh dicapai menggunakan pertanyaan pengagregatan dan pengalihan keluar.
db.events.aggregate([
    { "$group": {
        "_id": { "uid": "$uid", "sid": "$sid" },
        "dups": { "$push": "$_id" },
        "count": { "$sum": 1 }
    }},
    { "$match": { "count": { "$gt": 1 } }}
]).forEach(function(doc) {
    doc.dups.shift();
    db.events.remove({ "_id": {"$in": doc.dups }});
});
Salin selepas log masuk
  • Buat indeks unik: Selepas mengalih keluar pendua, cipta indeks unik seperti yang dimaksudkan.
db.events.createIndex({"uid":1 , "sid": 1},{unique:true})
Salin selepas log masuk

Operasi Upsert

Untuk bahagian kedua soalan, untuk mencapai tingkah laku yang diingini iaitu memasukkan atau mengemas kini dokumen berdasarkan kehadiran data sedia ada , gunakan kaedah ".update()" dengan pilihan "upsert":

$collection->update(
    array( "uid" => 1, "sid" => 1 ),
    array( '$set' => $someData ),
    array( 'upsert' => true )
);
Salin selepas log masuk

Ini akan mengubah suai dokumen yang ditemui dan memasukkan dokumen baharu mengikut keperluan. Selain itu, anda boleh menggunakan "$setOnInsert" untuk menentukan medan yang sepatutnya hanya ditetapkan semasa memasukkan dokumen.

Atas ialah kandungan terperinci Mengapa Saya Mendapat Dokumen Pendua dalam Koleksi MongoDB Saya Walaupun Selepas Mencipta Kunci Unik dengan `dropDups`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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