What if you could update just one item inside a list without rewriting the whole thing?
Why Array update with positional $ operator in MongoDB? - Purpose & Use Cases
Imagine you have a list of friends and their favorite colors stored on paper. You want to change the favorite color of one friend, but you have to rewrite the entire list every time you want to update just one friend's color.
Manually searching through the list and rewriting it is slow and easy to mess up. You might accidentally change the wrong friend's color or forget to update the list properly. It's frustrating and wastes time.
The positional $ operator in MongoDB lets you quickly find the exact friend in the list and update only their favorite color without touching the rest. It's like having a magic marker that points to the right spot and changes just that one item.
db.collection.update({"friends.name": "Alice"}, { $set: { "friends.0.color": "blue" } })db.collection.update({"friends.name": "Alice"}, { $set: { "friends.$.color": "blue" } })This lets you update specific items inside arrays easily and safely, making your data changes fast and accurate.
In a social app, you want to update the status of a single comment inside a post's comments array without rewriting all comments. The positional $ operator helps you do that quickly.
Manually updating array items is slow and error-prone.
The positional $ operator targets the exact array element to update.
This makes updates inside arrays simple, fast, and safe.
Practice
What does the positional $ operator do in a MongoDB update?
Solution
Step 1: Understand the positional operator usage
The$operator targets the first array element that matches the query condition.Step 2: Recognize update effect
It updates only that matched element without changing other array elements or the whole array.Final Answer:
It updates the first matching element in an array field. -> Option AQuick Check:
Positional$updates one array item [OK]
- Thinking $ replaces the whole array
- Confusing $ with $push or $pop
- Assuming it updates all matching elements
Which of the following is the correct syntax to update the first matching element in the scores array where score is 85?
db.students.updateOne(
{ "scores.score": 85 },
{ $set: { "scores.$.score": 90 } }
)Solution
Step 1: Identify the query filter
The filter must be on the array field without the positional operator:{ "scores.score": 85 }.Step 2: Use positional operator in update
The update uses"scores.$.score"to update the matched element's score.Final Answer:
db.students.updateOne({ "scores.score": 85 }, { $set: { "scores.$.score": 90 } }) -> Option CQuick Check:
Query without $; update with scores.$ [OK]
- Using $ in the query filter
- Not using $ in the update path
- Updating the whole array instead of one element
Given the document:
{ _id: 1, items: [ { name: "apple", qty: 5 }, { name: "banana", qty: 3 } ] }What will be the document after running this update?
db.collection.updateOne(
{ _id: 1, "items.name": "banana" },
{ $set: { "items.$.qty": 10 } }
)Solution
Step 1: Find matching array element
The query matches document with _id 1 and array element where name is "banana".Step 2: Update matched element's qty
The positional operator$updates the qty of the matched "banana" element to 10.Final Answer:
{ _id: 1, items: [ { name: "apple", qty: 5 }, { name: "banana", qty: 10 } ] } -> Option AQuick Check:
Only matched array element qty changed [OK]
- Updating wrong array element
- Adding new element instead of updating
- Replacing entire array
What is wrong with this update query?
db.orders.updateOne(
{ "products.$.id": 123 },
{ $set: { "products.$.quantity": 5 } }
)Solution
Step 1: Check query filter syntax
The positional operator$cannot be used in the query filter path; it must be omitted.Step 2: Correct query filter
The filter should be{ "products.id": 123 }to find the matching array element.Final Answer:
Both A and C are correct. -> Option BQuick Check:
No $ in query filter; only in update path [OK]
- Using $ in query filter
- Confusing query filter and update syntax
- Assuming $set can't update arrays
You have documents like:
{ _id: 1, tags: [ { name: "urgent", status: "open" }, { name: "review", status: "closed" } ] }Write an update query to change the status of the tag with name "review" to "open" using the positional $ operator.
Solution
Step 1: Use correct query filter
The filter should find the document with an array element wheretags.nameis "review".Step 2: Use positional operator in update
The update usestags.$.statusto update the matched tag's status to "open".Final Answer:
db.collection.updateOne({ "tags.name": "review" }, { $set: { "tags.$.status": "open" } }) -> Option DQuick Check:
Query on tags.name; update tags.$.status [OK]
- Using $ in query filter path
- Updating wrong field in array
- Not using positional operator in update
Ready to prove it?
Pass the test and this pattern moves unknown
