Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
DDDasal
2024-11-04 07:10:311062semak imbas

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

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 }});
});
  • Buat indeks unik: Selepas mengalih keluar pendua, cipta indeks unik seperti yang dimaksudkan.
db.events.createIndex({"uid":1 , "sid": 1},{unique:true})

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

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:
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