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

mongo tambahkan ke array bersarang jika entri tidak berisi dua bidang yang cocok

Tidak mungkin dengan pembaruan atom tunggal, saya khawatir, Anda harus melakukan beberapa operasi pembaruan yang memenuhi kedua kondisi.

Pisahkan logika pembaruan menjadi dua operasi pembaruan yang berbeda, yang pertama akan memerlukan penggunaan posisi $ operator untuk mengidentifikasi elemen dalam history array yang Anda inginkan dan $set untuk memperbarui bidang yang ada. Operasi ini mengikuti logika perbarui bidang JIKA nama DAN organisasi cocok

Sekarang, Anda ingin menggunakan findAndModify() metode untuk operasi ini karena dapat mengembalikan dokumen yang diperbarui. Secara default, dokumen yang dikembalikan tidak menyertakan modifikasi yang dibuat pada pembaruan.

Jadi, dipersenjatai dengan persenjataan ini, Anda kemudian dapat menyelidiki logika kedua Anda di operasi berikutnya yaitu perbarui JIKA kombinasi "history.name" dan "history.organisation" tidak ada dalam array . Dengan operasi pembaruan kedua ini, Anda harus menggunakan $push operator untuk menambahkan elemen.

Contoh berikut menunjukkan konsep di atas. Awalnya mengasumsikan Anda memiliki bagian kueri dan dokumen yang akan diperbarui sebagai objek terpisah.

Ambil contoh ketika kita memiliki dokumen yang cocok dengan larik riwayat yang ada, itu hanya akan melakukan operasi pembaruan tunggal, tetapi jika dokumen tidak cocok, maka findAndModify() metode akan mengembalikan nol, gunakan logika ini dalam operasi pembaruan kedua Anda untuk mendorong dokumen ke larik:

var doc = {
        "name": "Test123",
        "organisation": "Rat"
    }, // document to update. Note: the doc here matches the existing array
    query = { "email": "[email protected]" }; // query document

query["history.name"] = doc.name; // create the update query
query["history.organisation"] = doc.organisation;
var update = db.users.findAndModify({
    "query": query,
    "update": { 
        "$set": { 
            "history.$.name": doc.name,
            "history.$.organisation": doc.organisation
        }
    }
}); // return the document modified, if there's no matched document update = null

if (!update) {
    db.users.update(
        { "email": query.email },
        { "$push": { "history": doc } }
    );
}

Setelah operasi ini untuk dokumen yang cocok, kueri koleksi akan menghasilkan

. yang sama
db.users.find({ "email": "[email protected]" });

Keluaran:

{
    "_id" : ObjectId("575fe85bfe98c1fba0a6e535"),
    "email" : "[email protected]",
    "__v" : 0,
    "history" : [ 
        {
            "name" : "Test123",
            "organisation" : "Rat",
            "field" : 4,
            "another" : 3
        }
    ]
}

Sekarang pertimbangkan dokumen yang tidak cocok:

var doc = {
        "name": "foo",
        "organisation": "bar"
    }, // document to update. Note: the doc here does not matches the current array
    query = { "email": "[email protected]" }; // query document

query["history.name"] = doc.name; // create the update query
query["history.organisation"] = doc.organisation;
var update = db.users.findAndModify({
    "query": query,
    "update": { 
        "$set": { 
            "history.$.name": doc.name,
            "history.$.organisation": doc.organisation
        }
    }
}); // return the document modified, if there's no matched document update = null

if (!update) {
    db.users.update(
        { "email": query.email },
        { "$push": { "history": doc } }
    );
}

Menanyakan koleksi ini untuk dokumen ini

db.users.find({ "email": "[email protected]" });

akan menghasilkan

Keluaran:

{
    "_id" : ObjectId("575fe85bfe98c1fba0a6e535"),
    "email" : "[email protected]",
    "__v" : 0,
    "history" : [ 
        {
            "name" : "Test123",
            "organisation" : "Rat",
            "field" : 4,
            "another" : 3
        }, 
        {
            "name" : "foo",
            "organisation" : "bar"
        }
    ]
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tutorial dasar-dasar MongoDB

  2. Penjurnalan MongoDB :Apakah file jurnal digunakan saat klien meminta penulisan non jurnal dan penjurnalan diaktifkan di Mongod

  3. Menggunakan MongoDB sebagai Sumber Data di GoLang

  4. Cara memaksa MongoDB pullAll untuk mengabaikan pesanan dokumen

  5. Dapatkan _id dari dokumen yang dimasukkan dalam database Mongo di NodeJS