Bird
Raised Fist0
MongoDBquery~20 mins

Array update with $[identifier] filtered in MongoDB - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Array Update Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ query_result
intermediate
2:00remaining
Update specific array elements using $[identifier]

Given the following document in a collection products:

{
  _id: 1,
  name: "T-Shirt",
  sizes: [
    { size: "S", stock: 10 },
    { size: "M", stock: 5 },
    { size: "L", stock: 0 }
  ]
}

What will be the resulting document after running this update?

db.products.updateOne(
  { _id: 1 },
  { $inc: { "sizes.$[elem].stock": 3 } },
  { arrayFilters: [ { "elem.stock": { $lt: 5 } } ] }
)
A{ _id: 1, name: "T-Shirt", sizes: [ { size: "S", stock: 13 }, { size: "M", stock: 5 }, { size: "L", stock: 3 } ] }
B{ _id: 1, name: "T-Shirt", sizes: [ { size: "S", stock: 13 }, { size: "M", stock: 8 }, { size: "L", stock: 3 } ] }
C{ _id: 1, name: "T-Shirt", sizes: [ { size: "S", stock: 10 }, { size: "M", stock: 5 }, { size: "L", stock: 3 } ] }
D{ _id: 1, name: "T-Shirt", sizes: [ { size: "S", stock: 10 }, { size: "M", stock: 8 }, { size: "L", stock: 3 } ] }
Attempts:
2 left
💡 Hint

Look at which array elements have stock less than 5 before the update.

📝 Syntax
intermediate
2:00remaining
Identify the syntax error in array update with $[identifier]

Which of the following update commands will cause a syntax error when trying to update array elements with $[identifier]?

db.orders.updateOne(
  { _id: 101 },
  { $set: { "items.$[item].status": "shipped" } },
  { arrayFilters: [ { "item.qty": { $gte: 2 } } ] }
)
Adb.orders.updateOne({ _id: 101 }, { $set: { "items.$[item].status": "shipped" } }, { arrayFilters: [ { "item.qty": { $gte 2 } } ] })
Bdb.orders.updateOne({ _id: 101 }, { $set: { "items.$[item].status": "shipped" } }, { arrayFilters: [ { "item.qty": { $gte: 2 } } ] })
C)} ] } } 2 :etg$ { :"ytq.meti" { [ :sretliFyarra { ,} } "deppihs" :"sutats.]meti[$.smeti" { :tes$ { ,} 101 :di_ {(enOetadpu.sredro.bd
Db.orders.updateOne({ _id: 101 }, { $set: { "items.$[item].status": "shipped" } }, { arrayFilters: [ { "item.qty": { $gte: 2 } } ] })
Attempts:
2 left
💡 Hint

Check the syntax of the $gte operator in the array filter.

❓ optimization
advanced
2:00remaining
Optimize update to increment multiple array elements conditionally

You want to increment the score by 1 for all players in the players array whose level is greater than 10.

Which update command is the most efficient and correct?

Adb.games.updateOne({ _id: 5 }, { $inc: { "players.$[p].score": 1 } })
Bdb.games.updateMany({}, { $inc: { "players.$[p].score": 1 } }, { arrayFilters: [ { "p.level": { $gt: 10 } } ] })
Cdb.games.updateOne({ _id: 5 }, { $inc: { "players.$.score": 1 } }, { arrayFilters: [ { "p.level": { $gt: 10 } } ] })
Ddb.games.updateOne({ _id: 5 }, { $inc: { "players.$[p].score": 1 } }, { arrayFilters: [ { "p.level": { $gt: 10 } } ] })
Attempts:
2 left
💡 Hint

Consider the filter on the document and the use of arrayFilters to target multiple array elements.

🔧 Debug
advanced
2:00remaining
Why does this array update not change any elements?

Given this document:

{ _id: 10, tasks: [ { name: "task1", done: false }, { name: "task2", done: false } ] }

And this update command:

db.projects.updateOne(
  { _id: 10 },
  { $set: { "tasks.$[t].done": true } },
  { arrayFilters: [ { "t.done": true } ] }
)

Why does this update not change any elements?

ABecause the positional operator $ cannot be used with arrayFilters.
BBecause the array filter matches elements where done is true, but all are false initially.
CBecause the update query is missing the filter on _id: 10.
DBecause the update operator $set cannot be used on array elements.
Attempts:
2 left
💡 Hint

Check the condition inside arrayFilters and the initial values.

🧠 Conceptual
expert
3:00remaining
Understanding multiple arrayFilters with different identifiers

Consider a document:

{
  _id: 20,
  orders: [
    { id: 1, items: [ { product: "A", qty: 2 }, { product: "B", qty: 1 } ] },
    { id: 2, items: [ { product: "A", qty: 1 }, { product: "C", qty: 5 } ] }
  ]
}

You want to increment the quantity by 1 for product "A" only in order with id 2.

Which update command achieves this?

A
db.sales.updateOne(
  { _id: 20 },
  { $inc: { "orders.$[order].items.$[item].qty": 1 } },
  { arrayFilters: [ { "order.id": 2 }, { "item.product": "A" } ] }
)
B
db.sales.updateOne(
  { _id: 20 },
  { $inc: { "orders.$[item].items.$[order].qty": 1 } },
  { arrayFilters: [ { "order.id": 2 }, { "item.product": "A" } ] }
)
C
db.sales.updateOne(
  { _id: 20 },
  { $inc: { "orders.$[order].items.$[item].qty": 1 } },
  { arrayFilters: [ { "item.id": 2 }, { "order.product": "A" } ] }
)
D
db.sales.updateOne(
  { _id: 20 },
  { $inc: { "orders.$.items.$[item].qty": 1 } },
  { arrayFilters: [ { "item.product": "A" } ] }
)
Attempts:
2 left
💡 Hint

Use two different identifiers in arrayFilters to target nested arrays.

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