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

gangguan mongoDB pada array

Ini tidak sesederhana yang mungkin Anda pikirkan, dan sebenarnya menarik bahwa Anda telah membagi analisis Anda menjadi tiga bagian. Karena, coba tebak? Itulah yang Anda harus melakukan. Mari kita simak langkah-langkahnya:

1. Masukkan dokumen jika tidak ada

db.collection.update(
    { 
        "clientId":"123456"
    },
    {
        "$setOnInsert": {
            "clientId": "123456",
            "devices": [{
                "deviceId": "321",
                "deviceType" : "kindle",
                "notification" : false
            }]
        }
    },
    { "upsert": true }
)

Jadi yang ingin Anda lakukan adalah menyisipkan dokumen baru di mana "clientId" saat ini tidak ada. Ini dapat dilakukan sebagai "upsert" untuk menghindari kemungkinan bentrokan kunci yang unik dan bahkan jika tidak ada batasan "unik", maka sifat "upsert" ini memastikan Anda hanya membuat dokumen "baru" ketika tidak ditemukan. Juga ada $setOnInsert di sini karena Anda tidak ingin melakukan apa saja pada dokumen yang "ditemukan" pada saat ini.

Perhatikan di sini bahwa tidak ada tidak mencoba untuk mencocokkan elemen dalam array. Ini karena Anda mungkin tidak ingin "membuat" dokumen baru hanya karena dokumen yang sudah ada tidak memiliki elemen larik "itu". Yang membawa kita ke langkah berikutnya.

2. Perbarui konten dokumen di tempatnya

db.collection.update(
    { 
        "clientId":"123456",
        "devices": { "$elemMatch": { "deviceId" : "321" } }
    },
    {
        "$set": {
            "devices.$.deviceType" : "kindle",
            "devices.$.notification" : false
        }
    }
)

Sekarang di sini Anda ingin benar-benar mencoba dan "mencocokkan" dokumen untuk "clientId" yang tidak berisi elemen dalam larik yang juga cocok dengan "deviceId" yang Anda cari. Jadi dengan menentukan kondisi yang cocok, Anda mendapatkan penggunaan $ . posisional operator untuk mengatur bidang di posisi "cocok".

Seperti di atas, ini akan cocok dengan satu sesuatu atau tidak ada jadi apakah pembaruan dilakukan atau tidak. Jadi itu pindah ke bagian akhir dari kaskade kami di sini:

3. Tambahkan elemen array yang tidak ada

db.collection.update(
    { 
        "clientId":"123456"
    },
    {
        "$addToset": { "devices": {
            "deviceId" : "321",
            "deviceType" : "kindle",
            "notification" : false
        }}
    }
)

Jadi ini penting tahap terakhir. Alasannya adalah jika salah satu dari operasi sebelumnya berhasil "buat" atau "perbarui" dokumen yang ada, lalu gunakan $addToSet di sini membuat yakin Anda tidak "mendorong" dokumen lain ke array dengan "deviceId" yang sama tetapi nilai lain yang berbeda. Jika satu dari tahapan tersebut berhasil, maka ini akan melihat semua nilai elemen itu sudah ada, dan tidak akan menambahkan yang lain.

Jika Anda mencoba melakukannya dalam urutan yang berbeda, jika Anda menyajikannya, Anda akan mendapatkan dua dokumen dalam larik dengan "deviceId" yang sama, tetapi nilai yang berbeda untuk "deviceType" dan "notification". Jadi itu sebabnya ia datang terakhir.

Kesimpulan

Sayangnya, tidak ada cara sederhana untuk menggabungkan ini sebagai satu operasi. Operator tidak ada sehingga ini dapat dilakukan dalam satu pernyataan dan oleh karena itu Anda harus lakukan tiga memperbarui operasi untuk melakukan apa yang Anda inginkan. Juga seperti yang dinyatakan, pesanan aplikasi untuk pembaruan tersebut penting sehingga Anda mendapatkan hasil yang diinginkan.

Meskipun ini belum ada dalam rilis "produksi" saat ini, rilis yang akan datang ( 2.6 dan ke atas saat penulisan) memiliki cara untuk "mengumpulkan" permintaan ini dengan sintaks baru untuk diperbarui:

db.runCommand(
    "update": "collection",
    "updates": [
        { 
            "q": { "clientId":"123456" },
            "u": {
                "$setOnInsert": {
                    "clientId": "123456",
                    "devices": [{
                    "deviceId": "321",
                    "deviceType" : "kindle",
                    "notification" : false
                }]
            },
            "upsert": true
        },
        {
            "q": { 
                 "clientId":"123456",
                 "devices": { "$elemMatch": { "deviceId" : "321" } }
            },
            "u": {
                "$set": {
                    "devices.$.deviceType" : "kindle",
                    "devices.$.notification" : false
                 }
            }
        },
        {
            "q": { "clientId":"123456" },
            "u": {
                "$addToset": { "devices": {
                    "deviceId" : "321",
                    "deviceType" : "kindle",
                    "notification" : false
                }}
            }
        }
    ]
)

Jadi saat itu diam pada dasarnya tiga operasi, setidaknya Anda bisa mengirimnya melalui kabel sekali saja



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Menyimpan aliran data dari permintaan POST di GridFS, express, mongoDB, node.js

  2. Menghubungkan dari jarak jauh ke antarmuka http MongoDB di server EC2

  3. MongoDb - Ubah jenis dari Int menjadi Double

  4. MongoDB $mod

  5. Cara terbaik untuk menyimpan tanggal/waktu di mongodb