Du kan også prøve positional $
operator brugt med findAndModify()
metode. Operatøren vil identificere elementet i et array, der skal opdateres uden eksplicit at specificere elementets position i arrayet. Bemærk, array-feltet skal vises som en del af forespørgselsdokumentet, og for at returnere dokumentet med de ændringer, der er foretaget på opdateringen, skal du bruge den nye mulighed, så din opdatering ville være som
db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})
vil producere output:
{
"arr": [
{
"cond" : 1,
"upd" : 2
},
{
"cond" : 2,
"upd" : 3
},
{
"cond" : 4,
"upd" : 55
},
{
"cond" : 6,
"upd" : 7
},
{
"cond" : 8,
"upd" : 9
}
]
}
Da du ønsker at returnere det opdaterede dokument, med projektion den positionelle $-projektion
operatoren kan kun bruges i projektionsdokumentet for find()
metoden eller findOne()
metoden, så felt
option vil ikke projicere den del af arrayet ved hjælp af $ projektion
operatør.
En løsning ville være at bruge det oprindelige JavaScript filter()
metode på det returnerede arr-felt som
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);
Dette udskrives
[ { "cond" : 4, "upd" : 55 } ]
-- OPDATERING --
Eller $elemMatch
projektion, som du foreslog i kommentarerne nedenfor:
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);
Output :
{ "arr" : [ { "cond" : 4, "upd" : 55 } ] }