Sie können auch den Positionscode $
Operator, der mit
db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})
erzeugt die Ausgabe:
{
"arr": [
{
"cond" : 1,
"upd" : 2
},
{
"cond" : 2,
"upd" : 3
},
{
"cond" : 4,
"upd" : 55
},
{
"cond" : 6,
"upd" : 7
},
{
"cond" : 8,
"upd" : 9
}
]
}
Da Sie das aktualisierte Dokument zurückgeben möchten, müssen Sie mit der Projektion die Position $-Projektion
Operator kann nur im Projektionsdokument von find()
verwendet werden Methode oder die findOne()
Methode, also den findAndModify()
Feld
von Die Option projiziert diesen Teil des Arrays nicht mit $-Projektion
Betreiber.
Eine Problemumgehung wäre die Verwendung des nativen JavaScripts filter()
Methode für das zurückgegebene arr-Feld als
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);
Dies wird gedruckt
[ { "cond" : 4, "upd" : 55 } ]
-- AKTUALISIEREN --
Oder $elemMatch
Projektion, wie Sie in den Kommentaren unten vorgeschlagen haben:
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);
Ausgabe :
{ "arr" : [ { "cond" : 4, "upd" : 55 } ] }