MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Bagaimana cara menentukan apakah $addToSet benar-benar menambahkan item baru ke dalam dokumen MongoDB atau apakah item tersebut sudah ada?

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana saya mengembalikan urutan Postingan MongoDB berdasarkan waktu Favorit oleh pengguna?

  2. Buat TTL bersyarat di mongo

  3. Kendala Unik dengan Dua Bidang di MongoDB

  4. mengembalikan nilai dari panggilan balik di node.js dan luwak

  5. Spring Data MongoDB:Proyeksi dan Agregasi