MongoDB updating fields in nested array
11,238
Solution 1
You can't. The positional operator is only available for the first array in your document hierarchy. As such you cannot manipulate individual elements of deeper nester arrays.
It's a known issue and is scheduled for development here : https://jira.mongodb.org/browse/SERVER-831
Until that time you'll have to normalize your schema a bit I'm afraid.
Solution 2
This issue has been resolved. Feature of updating fields inside nested array of objects, is available in MongoDB 3.6+ versions. Look positional operators(all and with identifier) here.
//Update all docs in collection matching photo name "play" to "play photo"
db.collectioname.update(
{},
{ $set: { "albums.$[].photos.$[photo_field].name": "play photo" } },
{ arrayFilters: [ {"photo_field.name": "play"} ], multi: true}
);
//Update this specific doc given in question matching photo name "play" to "play photo"
db.collectioname.update(
{"_id" : ObjectId("4f41a5c7c32810e404000000")},
{ $set: { "albums.$[].photos.$[photo_field].name": "play photo" } },
{ arrayFilters: [ {"photo_field.name": "play"} ]}
);
This is for the help of people coming here after MongoDB 3.6
Author by
tonilin
Updated on June 16, 2022Comments
-
tonilin about 2 years
MongoDB updating fields in nested array
How can I set "play" to "play photo" in the
photos
array?I only know its
_id
."_id": ObjectId("4f41a5c7c32810e404000000"), "albums": [ { "_id": ObjectId("4f545d1bc328103812000000"), "name": "album1" , "photos":[{ "_id": ObjectId("4f545d1bc328103812d00000"), "name":"travel photo" },{ "_id": ObjectId("4f545d1bc328103812c00000"), "name":"play" }] }, { "_id": ObjectId("4f545f56c328103c12000000"), "name": "album2" }, { "_id": ObjectId("4f545f68c328103012000000"), "name": "album3" }, { "_id": ObjectId("4f546642c328103c12000001"), "name": "album4" }]