Můžete také vyzkoušet positional $
operátor používaný s findAndModify()
metoda. Operátor identifikuje prvek v poli, který se má aktualizovat, aniž by explicitně specifikoval pozici prvku v poli. Všimněte si, že pole pole se musí objevit jako součást dokumentu dotazu a chcete-li vrátit dokument s úpravami provedenými při aktualizaci, použijte novou možnost, takže vaše aktualizace bude vypadat takto
db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})
vytvoří výstup:
{
"arr": [
{
"cond" : 1,
"upd" : 2
},
{
"cond" : 2,
"upd" : 3
},
{
"cond" : 4,
"upd" : 55
},
{
"cond" : 6,
"upd" : 7
},
{
"cond" : 8,
"upd" : 9
}
]
}
Protože chcete vrátit aktualizovaný dokument, s projekcí pozičního $ projection
Operátor lze použít pouze v projekčním dokumentu find()
nebo findOne()
metoda, takže findAndModify()
field
možnost nepromítne tuto část pole pomocí $ projection
operátor.
Řešením by bylo použití nativního JavaScriptu filter()
metoda na vráceném poli arr jako
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);
Tím se vytiskne
[ { "cond" : 4, "upd" : 55 } ]
-- AKTUALIZACE --
Nebo $elemMatch
projekce, jak jste navrhli v komentářích níže:
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);
Výstup :
{ "arr" : [ { "cond" : 4, "upd" : 55 } ] }