MongoDB updating fields in nested array

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


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.