Update Operations
Data changes over time. A user updates their email, a product price changes, a blog post gets edited. MongoDB provides powerful update operations to modify existing documents. Let's learn how to use `updateOne()`, `updateMany()`, and `replaceOne()`.
Update Operators
Just like query operators help you find documents, **update operators** help you modify them. The most common is `$set`, but there are many others.
| Operator | Description |
|---|---|
| `$set` | Sets the value of a field |
| `$unset` | Removes a field |
| `$inc` | Increments a numeric value |
| `$mul` | Multiplies a numeric value |
| `$rename` | Renames a field |
| `$push` | Adds an element to an array |
| `$pull` | Removes an element from an array |
Think of update operators as editing tools. `$set` is like a pen that writes or changes text, `$unset` is like an eraser, and `$inc` is like a counter that ticks up or down.
updateOne() - Update First Matching Document
`updateOne()` updates the first document that matches the filter.
<!-- Update John's age to 31 -->db.users.updateOne( { name: "John" }, { $set: { age: 31 } })Output:
{ acknowledged: true, matchedCount: 1, modifiedCount: 1}updateMany() - Update All Matching Documents
`updateMany()` updates all documents that match the filter.
<!-- Add a "prime" field to all electronics products -->db.products.updateMany( { category: "electronics" }, { $set: { prime: true } })
<!-- Increase all prices by 10% -->db.products.updateMany( {}, { $mul: { price: 1.1 } })Using $inc to Increment
<!-- Increase view count by 1 -->db.posts.updateOne( { title: "First Post" }, { $inc: { views: 1 } })
<!-- Decrease stock by 5 (use negative value) -->db.products.updateOne( { name: "Laptop" }, { $inc: { stock: -5 } })Working with Arrays
$push - Add to Array
<!-- Add a new tag to a post -->db.posts.updateOne( { title: "First Post" }, { $push: { tags: "javascript" } })$pull - Remove from Array
<!-- Remove a tag from a post -->db.posts.updateOne( { title: "First Post" }, { $pull: { tags: "mongodb" } })replaceOne() - Replace Entire Document
Unlike `updateOne()` which modifies specific fields, `replaceOne()` replaces the entire document with a new one.
db.users.replaceOne( { name: "John" }, { name: "John", email: "john.new@example.com", phone: "555-1234" })Upsert - Update or Insert
Sometimes you want to update a document if it exists, or insert it if it doesn't. Use the `upsert` option.
<!-- If user "Jane" exists, update her age; if not, create her -->db.users.updateOne( { name: "Jane" }, { $set: { age: 28, email: "jane@example.com" } }, { upsert: true })Practical Example: Blog Post Analytics
<!-- Insert a blog post -->db.posts.insertOne({ title: "MongoDB Updates", content: "Learning about update operations...", views: 0, likes: 0, tags: ["mongodb", "database"]})
<!-- Someone viewed the post -->db.posts.updateOne( { title: "MongoDB Updates" }, { $inc: { views: 1 } })
<!-- Someone liked the post -->db.posts.updateOne( { title: "MongoDB Updates" }, { $inc: { likes: 1 } })
<!-- Add a new tag -->db.posts.updateOne( { title: "MongoDB Updates" }, { $push: { tags: "nodejs" } })
<!-- Check the final document -->db.posts.findOne({ title: "MongoDB Updates" })Two Minute Drill
- `updateOne()` modifies the first matching document, `updateMany()` modifies all matches.
- Use `$set` to change field values, `$inc` to increment numbers.
- Array operators: `$push` adds, `$pull` removes elements.
- `replaceOne()` replaces the entire document.
- Upsert (`{ upsert: true }`) creates a document if it doesn't exist.
- Always check `matchedCount` and `modifiedCount` to confirm your update worked.
Need more clarification?
Drop us an email at career@quipoinfotech.com
