Bird
Raised Fist0
MongoDBquery~10 mins

Array update with $[identifier] filtered in MongoDB - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Array update with $[identifier] filtered
Start Update Command
↓
Match Document
↓
Identify Array Elements
↓
Apply Filter $[identifier
↓
Update Matched Array Elements
↓
Save Document
↓
Done
The update command finds the document, filters array elements using $[identifier], updates those elements, then saves the document.
Execution Sample
MongoDB
db.inventory.updateOne(
  { _id: 1 },
  { $set: { "items.$[elem].qty": 100 } },
  { arrayFilters: [ { "elem.status": "A" } ] }
)
This updates the qty to 100 for all items in the array with status 'A' in the document with _id 1.
Execution Table
StepActionDocument State BeforeArray Elements FilteredUpdate AppliedDocument State After
1Find document with _id:1{ _id:1, items:[{item:'apple', qty:5, status:'A'}, {item:'banana', qty:10, status:'B'} ] }N/AN/A{ _id:1, items:[{item:'apple', qty:5, status:'A'}, {item:'banana', qty:10, status:'B'} ] }
2Filter array elements where status='A' using $[elem]{ _id:1, items:[{item:'apple', qty:5, status:'A'}, {item:'banana', qty:10, status:'B'} ] }[{item:'apple', qty:5, status:'A'}]N/A{ _id:1, items:[{item:'apple', qty:5, status:'A'}, {item:'banana', qty:10, status:'B'} ] }
3Update qty to 100 for filtered elements{ _id:1, items:[{item:'apple', qty:5, status:'A'}, {item:'banana', qty:10, status:'B'} ] }[{item:'apple', qty:5, status:'A'}]qty set to 100{ _id:1, items:[{item:'apple', qty:100, status:'A'}, {item:'banana', qty:10, status:'B'} ] }
4Save updated document{ _id:1, items:[{item:'apple', qty:100, status:'A'}, {item:'banana', qty:10, status:'B'} ] }N/AN/A{ _id:1, items:[{item:'apple', qty:100, status:'A'}, {item:'banana', qty:10, status:'B'} ] }
5Update complete{ _id:1, items:[{item:'apple', qty:100, status:'A'}, {item:'banana', qty:10, status:'B'} ] }N/AN/A{ _id:1, items:[{item:'apple', qty:100, status:'A'}, {item:'banana', qty:10, status:'B'} ] }
💡 All array elements with status 'A' updated; no other elements matched filter.
Variable Tracker
VariableStartAfter Step 2After Step 3Final
Document{ _id:1, items:[{item:'apple', qty:5, status:'A'}, {item:'banana', qty:10, status:'B'} ] }{ _id:1, items:[{item:'apple', qty:5, status:'A'}, {item:'banana', qty:10, status:'B'} ] }{ _id:1, items:[{item:'apple', qty:100, status:'A'}, {item:'banana', qty:10, status:'B'} ] }{ _id:1, items:[{item:'apple', qty:100, status:'A'}, {item:'banana', qty:10, status:'B'} ] }
Filtered Array Elements ($[elem])N/A[{item:'apple', qty:5, status:'A'}][{item:'apple', qty:100, status:'A'}][{item:'apple', qty:100, status:'A'}]
Key Moments - 2 Insights
Why does only the item with status 'A' get updated and not others?
Because the array filter $[elem] only matches elements where status='A' as shown in execution_table step 2, so only those elements are updated in step 3.
What happens if no array elements match the filter condition?
No elements get updated; the document remains unchanged as no array elements satisfy the filter, so update has no effect.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 2, which array elements are selected by the filter $[elem]?
ABoth apple and banana items
B[{item:'banana', qty:10, status:'B'}]
C[{item:'apple', qty:5, status:'A'}]
DNo elements selected
💡 Hint
Check the 'Array Elements Filtered' column at step 2 in execution_table.
At which step does the qty of the apple item change to 100?
AStep 1
BStep 3
CStep 2
DStep 4
💡 Hint
Look at the 'Update Applied' and 'Document State After' columns in execution_table.
If the filter was changed to {"elem.status": "B"}, which item would be updated?
Abanana item
Bboth apple and banana items
Capple item
Dno items
💡 Hint
Refer to variable_tracker 'Filtered Array Elements' and how filter matches status.
Concept Snapshot
MongoDB array update with $[identifier]:
- Use $[identifier] in update path to target array elements.
- Define arrayFilters to specify which elements to update.
- Only elements matching filter get updated.
- Other elements remain unchanged.
- Saves document after update automatically.
Full Transcript
This visual execution shows how MongoDB updates array elements using the $[identifier] filtered syntax. First, the update command finds the document by _id. Then it filters array elements using the arrayFilters condition, selecting only those with status 'A'. Next, it updates the qty field of those filtered elements to 100. Finally, the updated document is saved. The execution table traces each step, showing document state before and after, which elements are filtered, and when the update happens. The variable tracker highlights how the document and filtered elements change. Key moments clarify why only matching elements update and what happens if no elements match. The quiz tests understanding of filtering and update timing. The snapshot summarizes the syntax and behavior for quick reference.

Practice

(1/5)
1. What does the $[identifier] syntax do in a MongoDB update operation?
easy
A. It updates only the array elements that match the filter specified in arrayFilters.
B. It deletes the entire array from the document.
C. It adds a new element to the array without any condition.
D. It replaces the whole document with a new one.

Solution

  1. Step 1: Understand $[identifier] usage

    The $[identifier] syntax is used to target specific elements inside an array during an update.
  2. Step 2: Role of arrayFilters

    The arrayFilters option specifies which array elements the $[identifier] refers to, so only those elements get updated.
  3. Final Answer:

    It updates only the array elements that match the filter specified in arrayFilters. -> Option A
  4. Quick Check:

    $[identifier] updates filtered array items [OK]
Hint: Remember: $[id] updates filtered array elements only [OK]
Common Mistakes:
  • Thinking $[identifier] updates the whole array
  • Confusing $[identifier] with $push or $set without filters
  • Ignoring the need for arrayFilters option
2. Which of the following is the correct syntax to update array elements using $[elem] with arrayFilters in MongoDB?
easy
A. db.collection.updateOne({},{ $set: { 'array.$[elem]': value } }, { arrayFilters: [ { 'elem.field': condition } ] })
B. db.collection.updateOne({},{ $push: { 'array.$[elem]': value } }, { arrayFilters: [ { 'elem.field': condition } ] })
C. db.collection.updateOne({},{ $set: { 'array.$elem': value } }, { arrayFilters: [ { 'elem.field': condition } ] })
D. db.collection.updateOne({},{ $set: { 'array.$[elem]': value } })

Solution

  1. Step 1: Identify correct update operator and syntax

    The $set operator is used to update existing fields. The positional filtered identifier must be inside square brackets like $[elem].
  2. Step 2: Confirm usage of arrayFilters

    The arrayFilters option must be provided with a filter object matching the identifier used inside $[elem].
  3. Final Answer:

    db.collection.updateOne({},{ $set: { 'array.$[elem]': value } }, { arrayFilters: [ { 'elem.field': condition } ] }) -> Option A
  4. Quick Check:

    Use $set with $[elem] and arrayFilters [OK]
Hint: Use $set with $[identifier] and arrayFilters together [OK]
Common Mistakes:
  • Using $push instead of $set for updates
  • Missing square brackets around identifier
  • Not providing arrayFilters option
3. Given the collection document:
{ _id: 1, scores: [ { type: 'quiz', score: 5 }, { type: 'exam', score: 8 }, { type: 'quiz', score: 7 } ] }

What will be the result of this update?
db.collection.updateOne({ _id: 1 }, { $set: { 'scores.$[elem].score': 10 } }, { arrayFilters: [ { 'elem.type': 'quiz' } ] })

What will the scores array look like after the update?
medium
A. [ { type: 'quiz', score: 5 }, { type: 'exam', score: 8 }, { type: 'quiz', score: 7 } ]
B. [ { type: 'quiz', score: 10 }, { type: 'exam', score: 10 }, { type: 'quiz', score: 10 } ]
C. [ { type: 'quiz', score: 10 }, { type: 'exam', score: 8 }, { type: 'quiz', score: 7 } ]
D. [ { type: 'quiz', score: 10 }, { type: 'exam', score: 8 }, { type: 'quiz', score: 10 } ]

Solution

  1. Step 1: Identify which array elements match the filter

    The filter { 'elem.type': 'quiz' } matches the first and third elements in the scores array.
  2. Step 2: Apply the update to matched elements only

    The score field of these matched elements is set to 10, while the second element remains unchanged.
  3. Final Answer:

    [ { type: 'quiz', score: 10 }, { type: 'exam', score: 8 }, { type: 'quiz', score: 10 } ] -> Option D
  4. Quick Check:

    Only 'quiz' type scores updated to 10 [OK]
Hint: Only elements matching arrayFilters get updated [OK]
Common Mistakes:
  • Updating all elements ignoring arrayFilters
  • Updating wrong elements by misreading filter
  • Expecting update without arrayFilters to work
4. You run this update:
db.collection.updateOne({ _id: 1 }, { $set: { 'items.$[i].status': 'sold' } }, { arrayFilters: [ { 'item.status': 'available' } ] })

But no documents are updated. What is the most likely cause?
medium
A. The $set operator cannot be used with $[i].
B. The query filter {_id: 1} is incorrect.
C. The identifier in arrayFilters does not match the one in the update query.
D. MongoDB does not support arrayFilters in updateOne.

Solution

  1. Step 1: Check identifier consistency

    The update uses $[i] but the arrayFilters uses item. These must match exactly.
  2. Step 2: Understand effect of mismatch

    Because the identifiers differ, MongoDB cannot apply the filter, so no elements are updated.
  3. Final Answer:

    The identifier in arrayFilters does not match the one in the update query. -> Option C
  4. Quick Check:

    Identifier names must match in update and arrayFilters [OK]
Hint: Match identifier names exactly in update and arrayFilters [OK]
Common Mistakes:
  • Using different names for identifier and filter variable
  • Assuming $set can't work with $[identifier]
  • Blaming query filter without checking arrayFilters
5. You have documents with an array field tasks where each task has status and priority. You want to update only tasks with status: 'pending' and priority greater than 5, setting their status to 'in-progress'. Which update command correctly does this?
hard
A. db.collection.updateMany({}, { $set: { 'tasks.$.status': 'in-progress' } }, { arrayFilters: [ { 't.status': 'pending', 't.priority': { $gt: 5 } } ] })
B. db.collection.updateMany({}, { $set: { 'tasks.$[t].status': 'in-progress' } }, { arrayFilters: [ { 't.status': 'pending', 't.priority': { $gt: 5 } } ] })
C. db.collection.updateMany({}, { $set: { 'tasks.$[t].status': 'in-progress' } }, { arrayFilters: [ { 't.status': 'pending' && 't.priority': { $gt: 5 } } ] })
D. db.collection.updateMany({}, { $set: { 'tasks.$[t].status': 'in-progress' } }, { arrayFilters: [ { 't.status': 'pending' }, { 'u.priority': { $gt: 5 } } ] })

Solution

  1. Step 1: Use a single filter object combining conditions

    The arrayFilters option must have one object combining both conditions with commas, meaning AND logic.
  2. Step 2: Use correct identifier and update syntax

    The update uses $[t] matching the filter identifier t, and $set to update the status field.
  3. Final Answer:

    db.collection.updateMany({}, { $set: { 'tasks.$[t].status': 'in-progress' } }, { arrayFilters: [ { 't.status': 'pending', 't.priority': { $gt: 5 } } ] }) -> Option B
  4. Quick Check:

    Combine conditions in one filter object with matching identifier [OK]
Hint: Combine multiple conditions in one arrayFilter object [OK]
Common Mistakes:
  • Splitting conditions into multiple filter objects (no AND)
  • Using logical operators incorrectly inside arrayFilters
  • Using positional $ instead of filtered $[identifier]
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard