Bird
Raised Fist0
MongoDBquery~30 mins

Array update with positional $ operator in MongoDB - Mini Project: Build & Apply

Choose your learning style10 modes available
Update a Specific Array Element Using the Positional $ Operator in MongoDB
📖 Scenario: You are managing a database for a small bookstore. Each book document contains an array of reviews. You want to update a specific review's rating based on the reviewer's name.
🎯 Goal: Learn how to update a specific element inside an array in a MongoDB document using the positional $ operator.
📋 What You'll Learn
Create a collection called books with one document containing a title and an array called reviews.
Add a variable to specify the reviewer's name whose rating you want to update.
Write a MongoDB update query that uses the positional $ operator to update the rating of the review by the specified reviewer.
Complete the update operation by specifying the correct filter and update syntax.
💡 Why This Matters
🌍 Real World
Updating specific elements inside arrays is common in applications like product reviews, user comments, or order items where you want to change only one item without replacing the whole array.
💼 Career
Knowing how to use the positional $ operator is essential for database developers and backend engineers working with MongoDB to efficiently update array elements.
Progress0 / 4 steps
1
Create the books collection with one book document
Create a MongoDB document for the books collection with the title set to 'Learn MongoDB' and a reviews array containing two review objects: { reviewer: 'Alice', rating: 4 } and { reviewer: 'Bob', rating: 5 }.
MongoDB
Hint

Use db.books.insertOne() to add a document with the specified title and reviews array.

2
Set the reviewer's name to update
Create a variable called reviewerName and set it to 'Alice' to specify which reviewer's rating you want to update.
MongoDB
Hint

Use const reviewerName = 'Alice' to store the reviewer's name.

3
Write the update query using the positional $ operator
Write a MongoDB update query using db.books.updateOne() that finds the document where reviews.reviewer matches reviewerName and updates the rating of that review to 5 using the positional $ operator.
MongoDB
Hint

Use db.books.updateOne() with a filter on 'reviews.reviewer' and update 'reviews.$.rating' to 5.

4
Complete the update operation with correct filter and update syntax
Ensure the update query uses the correct filter { 'reviews.reviewer': reviewerName } and the update document { $set: { 'reviews.$.rating': 5 } } to update the rating of the matched review.
MongoDB
Hint

Double-check the filter and update document syntax matches exactly.

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