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