Je kunt ook de positionele $
operator gebruikt met de findAndModify()
methode. De operator identificeert het element in een array dat moet worden bijgewerkt zonder expliciet de positie van het element in de array op te geven. Let op, het matrixveld moet verschijnen als onderdeel van het querydocument en om het document terug te geven met de wijzigingen die bij de update zijn aangebracht, gebruikt u de nieuwe optie, zodat uw update eruit zou zien
db.tests.findAndModify({
query: {
"arr.cond": 4
},
update: {
"$set": {"arr.$.upd": 55 }
},
new : true,
fields: { "arr": 1, "_id": 0 }
})
zal de output produceren:
{
"arr": [
{
"cond" : 1,
"upd" : 2
},
{
"cond" : 2,
"upd" : 3
},
{
"cond" : 4,
"upd" : 55
},
{
"cond" : 6,
"upd" : 7
},
{
"cond" : 8,
"upd" : 9
}
]
}
Aangezien u het bijgewerkte document wilt retourneren, met projectie de positionele $ projectie
operator kan alleen worden gebruikt in het projectiedocument van de find()
methode of de findOne()
methode dus de findAndModify()
's veld
optie zal dat deel van de array niet projecteren met behulp van de $ projectie
telefoniste.
Een tijdelijke oplossing zou zijn om het native JavaScript filter()
methode in het geretourneerde arr-veld 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);
Dit wordt afgedrukt
[ { "cond" : 4, "upd" : 55 } ]
-- UPDATE --
Of de $elemMatch
projectie zoals je suggereerde in de opmerkingen hieronder:
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);
Uitvoer :
{ "arr" : [ { "cond" : 4, "upd" : 55 } ] }