Bird
Raised Fist0
MongoDBquery~10 mins

Array update with positional $ operator in MongoDB - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Array update with positional $ operator
Find document matching query
↓
Locate array element matching condition
↓
Use positional $ operator to target element
↓
Update the targeted array element
↓
Save document
This flow shows how MongoDB finds a document, locates the matching array element using the positional $ operator, updates it, and saves the document.
Execution Sample
MongoDB
db.students.updateOne(
  { "grades.grade": 85 },
  { $set: { "grades.$.grade": 90 } }
)
This updates the first array element in 'grades' with grade 85 to have grade 90.
Execution Table
StepQuery ConditionArray Element CheckedMatch Found?Update ActionDocument State After Step
1{"grades.grade": 85}grades[0] = {grade: 80}NoNo update{"grades": [{"grade": 80}, {"grade": 85}, {"grade": 88}]}
2{"grades.grade": 85}grades[1] = {grade: 85}YesUpdate grades[1].grade to 90{"grades": [{"grade": 80}, {"grade": 90}, {"grade": 88}]}
3N/AN/AN/AUpdate complete{"grades": [{"grade": 80}, {"grade": 90}, {"grade": 88}]}
💡 Update stops after first matching array element is updated using positional $ operator.
Variable Tracker
VariableStartAfter Step 1After Step 2Final
Document grades array[{grade:80}, {grade:85}, {grade:88}]Same[{grade:80}, {grade:90}, {grade:88}][{grade:80}, {grade:90}, {grade:88}]
Matched array indexNoneNone11
Key Moments - 3 Insights
Why does only the first matching array element get updated?
Because the positional $ operator targets only the first array element that matches the query condition, as shown in execution_table row 2.
What happens if no array element matches the condition?
No update occurs; the document remains unchanged, as shown in execution_table row 1 where no match is found.
Can the positional $ operator update multiple elements at once?
No, it updates only the first matching element. To update multiple elements, other operators like $[] are needed.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of grades[1].grade after Step 2?
A85
B80
C90
D88
💡 Hint
Check the 'Document State After Step' column in row 2.
At which step does the positional $ operator apply the update?
AStep 2
BStep 1
CStep 3
DNo update applied
💡 Hint
Look at the 'Update Action' column to see when the update happens.
If the query was {"grades.grade": 100}, what would happen?
Agrades[1].grade updates to 90
BNo array element matches, no update
CAll grades updated to 90
DError occurs
💡 Hint
Refer to key_moments about no matching element scenario.
Concept Snapshot
MongoDB positional $ operator updates the first array element matching the query.
Syntax: { $set: { "arrayField.$.field": value } }
Only the first matching element is updated.
If no match, no update occurs.
Use for precise array element updates inside documents.
Full Transcript
This visual execution shows how MongoDB updates an array element using the positional $ operator. First, it finds the document with an array element matching the query condition. Then it locates the first matching element in the array. Using the positional $ operator, it updates that element's field. The update stops after the first match. If no element matches, no update happens. This operator is useful for updating one specific array element inside a document.

Practice

(1/5)
1.

What does the positional $ operator do in a MongoDB update?

easy
A. It updates the first matching element in an array field.
B. It deletes the entire array field.
C. It adds a new element to the array.
D. It replaces the whole document.

Solution

  1. Step 1: Understand the positional operator usage

    The $ operator targets the first array element that matches the query condition.
  2. Step 2: Recognize update effect

    It updates only that matched element without changing other array elements or the whole array.
  3. Final Answer:

    It updates the first matching element in an array field. -> Option A
  4. Quick Check:

    Positional $ updates one array item [OK]
Hint: Positional $ updates only the first matched array element [OK]
Common Mistakes:
  • Thinking $ replaces the whole array
  • Confusing $ with $push or $pop
  • Assuming it updates all matching elements
2.

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 } }
)
easy
A. db.students.updateOne({ "scores.score": 85 }, { $set: { "scores.score": 90 } })
B. db.students.updateOne({ "scores.$.score": 85 }, { $set: { "scores.$.score": 90 } })
C. db.students.updateOne({ "scores.score": 85 }, { $set: { "scores.$.score": 90 } })
D. db.students.updateOne({ "scores.$.score": 85 }, { $set: { "scores.score": 90 } })

Solution

  1. Step 1: Identify the query filter

    The filter must be on the array field without the positional operator: { "scores.score": 85 }.
  2. Step 2: Use positional operator in update

    The update uses "scores.$.score" to update the matched element's score.
  3. Final Answer:

    db.students.updateOne({ "scores.score": 85 }, { $set: { "scores.$.score": 90 } }) -> Option C
  4. Quick Check:

    Query without $; update with scores.$ [OK]
Hint: Use $ only in update path, not in query filter [OK]
Common Mistakes:
  • Using $ in the query filter
  • Not using $ in the update path
  • Updating the whole array instead of one element
3.

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 } }
)
medium
A. { _id: 1, items: [ { name: "apple", qty: 5 }, { name: "banana", qty: 10 } ] }
B. { _id: 1, items: [ { name: "apple", qty: 10 }, { name: "banana", qty: 3 } ] }
C. { _id: 1, items: [ { name: "apple", qty: 5 }, { name: "banana", qty: 3 }, { name: "banana", qty: 10 } ] }
D. { _id: 1, items: [ { name: "apple", qty: 5 } ] }

Solution

  1. Step 1: Find matching array element

    The query matches document with _id 1 and array element where name is "banana".
  2. Step 2: Update matched element's qty

    The positional operator $ updates the qty of the matched "banana" element to 10.
  3. Final Answer:

    { _id: 1, items: [ { name: "apple", qty: 5 }, { name: "banana", qty: 10 } ] } -> Option A
  4. Quick Check:

    Only matched array element qty changed [OK]
Hint: Positional $ updates only matched array element [OK]
Common Mistakes:
  • Updating wrong array element
  • Adding new element instead of updating
  • Replacing entire array
4.

What is wrong with this update query?

db.orders.updateOne(
  { "products.$.id": 123 },
  { $set: { "products.$.quantity": 5 } }
)
medium
A. Using positional operator $ in the query filter is invalid.
B. Both A and C are correct.
C. The query filter should use products.id without $.
D. The $set operator cannot update array elements.

Solution

  1. Step 1: Check query filter syntax

    The positional operator $ cannot be used in the query filter path; it must be omitted.
  2. Step 2: Correct query filter

    The filter should be { "products.id": 123 } to find the matching array element.
  3. Final Answer:

    Both A and C are correct. -> Option B
  4. Quick Check:

    No $ in query filter; only in update path [OK]
Hint: Never use $ in query filter, only in update path [OK]
Common Mistakes:
  • Using $ in query filter
  • Confusing query filter and update syntax
  • Assuming $set can't update arrays
5.

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.

hard
A. db.collection.updateOne({ "tags.name": "review" }, { $set: { "tags.$.name": "open" } })
B. db.collection.updateOne({ "tags.$.name": "review" }, { $set: { "tags.status": "open" } })
C. db.collection.updateOne({ "tags.name": "review" }, { $set: { "tags.status": "open" } })
D. db.collection.updateOne({ "tags.name": "review" }, { $set: { "tags.$.status": "open" } })

Solution

  1. Step 1: Use correct query filter

    The filter should find the document with an array element where tags.name is "review".
  2. Step 2: Use positional operator in update

    The update uses tags.$.status to update the matched tag's status to "open".
  3. Final Answer:

    db.collection.updateOne({ "tags.name": "review" }, { $set: { "tags.$.status": "open" } }) -> Option D
  4. Quick Check:

    Query on tags.name; update tags.$.status [OK]
Hint: Match array element in query; update with tags.$.field [OK]
Common Mistakes:
  • Using $ in query filter path
  • Updating wrong field in array
  • Not using positional operator in update
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