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

Share:
11,238
tonilin
Author by

tonilin

Updated on June 16, 2022

Comments

  • tonilin
    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" 
    }]