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 samadb.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"
}
]
}