Anda juga dapat mencoba positional $
operator yang digunakan dengan findAndModify()
metode. Operator akan mengidentifikasi elemen dalam array untuk diperbarui tanpa secara eksplisit menentukan posisi elemen dalam array. Catatan, bidang array harus muncul sebagai bagian dari dokumen kueri dan untuk mengembalikan dokumen dengan modifikasi yang dibuat pada pembaruan, gunakan opsi baru, sehingga pembaruan Anda akan seperti
db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})
akan menghasilkan output:
{
"arr": [
{
"cond" : 1,
"upd" : 2
},
{
"cond" : 2,
"upd" : 3
},
{
"cond" : 4,
"upd" : 55
},
{
"cond" : 6,
"upd" : 7
},
{
"cond" : 8,
"upd" : 9
}
]
}
Karena Anda ingin mengembalikan dokumen yang diperbarui, dengan proyeksi posisi $ projection
operator hanya dapat digunakan dalam dokumen proyeksi find()
metode atau findOne()
metode sehingga findAndModify()
field
opsi tidak akan memproyeksikan bagian larik tersebut menggunakan $ projection
operator.
Solusinya adalah dengan menggunakan JavaScript asli filter()
metode pada bidang arr yang dikembalikan sebagai
var result = db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})
var updated = []
if (result && result.arr) updated = result.arr.filter(function (item) { return item.cond == 4; });
printjson(updated);
Ini akan mencetak
[ { "cond" : 4, "upd" : 55 } ]
-- PERBARUI --
Atau $elemMatch
proyeksi seperti yang Anda sarankan di komentar di bawah:
var result = db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: {"arr": {"$elemMatch": { "cond": 4 } }, "_id": 0 }
})
printjson(result);
Keluaran :
{ "arr" : [ { "cond" : 4, "upd" : 55 } ] }