Możesz także wypróbować positional $
operator używany z findAndModify()
metoda. Operator zidentyfikuje element w tablicy do aktualizacji bez wyraźnego określenia pozycji elementu w tablicy. Uwaga, pole tablicy musi pojawić się jako część dokumentu zapytania i aby zwrócić dokument z modyfikacjami dokonanymi podczas aktualizacji, użyj nowej opcji, aby Twoja aktualizacja wyglądała jak
db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})
wygeneruje wynik:
{
"arr": [
{
"cond" : 1,
"upd" : 2
},
{
"cond" : 2,
"upd" : 3
},
{
"cond" : 4,
"upd" : 55
},
{
"cond" : 6,
"upd" : 7
},
{
"cond" : 8,
"upd" : 9
}
]
}
Ponieważ chcesz zwrócić zaktualizowany dokument, z projekcją pozycyjną $ projection
operator może być używany tylko w dokumencie projekcji funkcji find()
metoda lub findOne()
metoda więc findAndModify()
field
opcja nie wyświetli tej części tablicy przy użyciu $ projection
operatora.
Obejściem byłoby użycie natywnego JavaScript filter()
metoda na zwróconym polu 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);
To zostanie wydrukowane
[ { "cond" : 4, "upd" : 55 } ]
-- AKTUALIZUJ --
Lub $elemMatch
projekcja, jak sugerowałeś w komentarzach poniżej:
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);
Wyjście :
{ "arr" : [ { "cond" : 4, "upd" : 55 } ] }