Tentu saja apa yang Anda lakukan di sini sebenarnya adalah memeriksa respons yang menunjukkan apakah dokumen telah diperbarui atau dimasukkan atau sebenarnya jika tidak ada operasi yang terjadi. Itu adalah indikator terbaik Anda untuk $addToSet
untuk melakukan pembaruan, dokumen kemudian akan diperbarui.
$addToSet
operator sendiri tidak dapat menghasilkan duplikat, itu adalah sifat dari operator. Tetapi Anda mungkin memang memiliki beberapa masalah dengan logika Anda:
{
"$addToSet", new BsonDocument()
{
{ "items", new BsonDocument()
{
{ "id", item.Id },
{ "v", item.Value }
}
}
}
}
Jadi dengan jelas Anda menunjukkan bahwa item di "set" Anda terdiri dari dua bidang, jadi jika konten itu bervariasi dengan cara apa pun (yaitu id yang sama tetapi nilainya berbeda) maka item tersebut sebenarnya adalah anggota "unik" dari set dan akan ditambahkan. Tidak akan ada cara misalnya untuk $addToSet
operator untuk tidak menambahkan nilai baru murni berdasarkan "id" sebagai pengidentifikasi unik. Anda harus benar-benar menggulungnya dalam kode.
Kemungkinan kedua di sini untuk bentuk duplikat adalah bahwa bagian kueri Anda tidak menemukan dokumen yang harus diperbarui dengan benar. Hasil dari ini akan membuat dokumen baru yang hanya berisi anggota yang baru ditentukan di "set". Jadi kesalahan penggunaan yang umum adalah seperti ini:
db.collection.update(
{
"id": ABC,
"items": { "$elemMatch": {
"id": 123, "v": 10
}},
{
"$addToSet": {
"items": {
"id": 123, "v": 10
}
}
},
{ "upsert": true }
)
Hasil dari operasi semacam itu akan selalu membuat dokumen baru karena dokumen yang ada tidak mengandung elemen yang ditentukan dalam "set". Penerapan yang benar adalah tidak periksa keberadaan anggota "set" dan izinkan $addToSet
untuk melakukan pekerjaan.
Jika memang Anda memiliki benar entri duplikat terjadi di "set" di mana semua elemen sub-dokumen persis sama, maka itu disebabkan oleh beberapa kode lain baik yang ada maupun yang sudah lampau.
Jika Anda yakin ada entri baru yang dibuat, lihat kode untuk contoh $push
atau memang dan manipulasi array dalam kode yang tampaknya bekerja pada bidang yang sama.
Tetapi jika Anda menggunakan operator dengan benar maka $addToSet
melakukan persis apa yang dimaksudkan untuk dilakukan.