I have a collection that has document structure like following:
{ "basicDetails": { "id": "1", "name": "xyz" }, "tasks": [{ "id": "10", "name": "task10", "subtasks": [{ "id": "120", "name": "subTask120", "description": "ABC" }] }] }
As you can see, each document has basicDetails object and a tasks array. Each task contains some properties of its own and a subtasks array.
I want to update subtasks’s description from ABC
to XYZ
where root level id is 1, task'id is 10 and subTasks.id =120
How do I do so?
I know I could find correct document via:
db.collection.find({ "basicDetails.id": "1", "tasks": { "$elemMatch": { "id": "10", "subtasks": { "$elemMatch": { "id": "120" } } } } })
But how do I update it? I want to update only one single property of a single subtasks i.e description
Advertisement
Answer
To update nested arrays, the filtered positional operator $[identifier] identifies the array elements that match the arrayFilters
conditions for an update operation.
Try the following query to $set
in nested array:
db.collection.updateOne({ "basicDetails.id": "1" }, { "$set": { "tasks.$[tasks].subtasks.$[subtasks].description": "XYZ" } }, { "arrayFilters": [ { "tasks.id": "10" }, { "subtasks.id": "120" } ] })