Skip to main content

MongoDB Update Operations

Introduction

In MongoDB, update operations modify existing documents in a collection. These operations are essential for maintaining up-to-date information in your database. MongoDB offers several methods and operators to update documents, allowing you to perform simple field updates, complex modifications, or even replace entire documents.

In this tutorial, we'll explore:

  • Basic update methods
  • Update operators
  • Options for updating documents
  • Practical examples of update operations

Basic Update Methods

MongoDB provides several methods for updating documents:

  1. updateOne() - updates a single document that matches the filter
  2. updateMany() - updates all documents that match the filter
  3. replaceOne() - replaces a single document that matches the filter

Let's examine each of these methods in detail.

The updateOne() Method

The updateOne() method updates a single document that matches the specified filter criteria.

Syntax

javascript
db.collection.updateOne(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ]
}
)

Example: Simple Field Update

Let's say we have a users collection with the following document:

javascript
{
_id: ObjectId("5f7d1b25c9b6132f9c76326a"),
name: "John Doe",
email: "[email protected]",
age: 30,
status: "active"
}

To update John's age:

javascript
db.users.updateOne(
{ name: "John Doe" },
{ $set: { age: 31 } }
)

Output:

javascript
{
"acknowledged": true,
"matchedCount": 1,
"modifiedCount": 1
}

The updateMany() Method

The updateMany() method updates all documents that match the specified filter criteria.

Syntax

javascript
db.collection.updateMany(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ]
}
)

Example: Update Multiple Documents

Let's update the status of all inactive users:

javascript
db.users.updateMany(
{ status: "inactive" },
{ $set: { status: "archived" } }
)

Output:

javascript
{
"acknowledged": true,
"matchedCount": 5,
"modifiedCount": 5
}

The replaceOne() Method

The replaceOne() method replaces an entire document with a new document.

Syntax

javascript
db.collection.replaceOne(
<filter>,
<replacement>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>
}
)

Example: Replace a Document

javascript
db.users.replaceOne(
{ name: "John Doe" },
{
name: "John Smith",
email: "[email protected]",
age: 35,
status: "active"
}
)

Output:

javascript
{
"acknowledged": true,
"matchedCount": 1,
"modifiedCount": 1
}

Update Operators

MongoDB provides various update operators that specify the modifications to perform on fields in documents.

Field Update Operators

OperatorDescription
$setSets the value of a field
$unsetRemoves the specified field
$renameRenames a field
$incIncrements the value of a field by a specified amount
$mulMultiplies the value of a field by a specified amount
$minUpdates the field if the specified value is less than the existing field value
$maxUpdates the field if the specified value is greater than the existing field value

Let's see some examples:

$set Operator

Sets the value of a field:

javascript
db.users.updateOne(
{ name: "John Smith" },
{ $set: { age: 36, "address.city": "New York" } }
)

$unset Operator

Removes a field:

javascript
db.users.updateOne(
{ name: "John Smith" },
{ $unset: { temporary_field: "" } }
)

$inc Operator

Increments a field by a specified value:

javascript
db.products.updateOne(
{ _id: ObjectId("5f7d1b25c9b6132f9c763270") },
{ $inc: { quantity: -1, sold: 1 } }
)

This decreases the quantity by 1 and increases the sold count by 1.

Array Update Operators

OperatorDescription
$pushAdds an element to an array
$popRemoves the first or last element of an array
$pullRemoves all array elements that match a specified query
$addToSetAdds elements to an array only if they don't already exist

Let's look at some examples:

$push Operator

Add an element to an array:

javascript
db.users.updateOne(
{ name: "John Smith" },
{ $push: { hobbies: "hiking" } }
)

$addToSet Operator

Add elements to an array only if they don't exist:

javascript
db.users.updateOne(
{ name: "John Smith" },
{ $addToSet: { hobbies: { $each: ["reading", "cooking", "hiking"] } } }
)

Only "reading" and "cooking" would be added if "hiking" already exists in the array.

Update Options

Upsert

The upsert option creates a new document if no document matches the filter. If set to true and no document matches the filter, MongoDB will insert a new document.

javascript
db.users.updateOne(
{ email: "[email protected]" },
{ $set: { name: "Jane Doe", age: 28, status: "active" } },
{ upsert: true }
)

If no user with the email "[email protected]" exists, a new document will be created.

Multi-update (for deprecated update() method)

In the older update() method (now deprecated), the multi option specifies whether to update multiple documents. By default, update() only updates the first document that matches the filter. With the newer methods, you should use updateOne() or updateMany() instead.

Advanced Update Patterns

Updating Nested Documents

To update fields in nested documents, use dot notation:

javascript
db.users.updateOne(
{ _id: ObjectId("5f7d1b25c9b6132f9c76326a") },
{
$set: {
"address.city": "Los Angeles",
"address.state": "CA",
"address.zip": "90001"
}
}
)

Updating Array Elements

Update by Position

Update the second element in the scores array:

javascript
db.students.updateOne(
{ _id: ObjectId("5f7d1b25c9b6132f9c76326b") },
{ $set: { "scores.1": 95 } }
)

Update by Query

Update the math score in the scores array:

javascript
db.students.updateOne(
{ _id: ObjectId("5f7d1b25c9b6132f9c76326b") },
{ $set: { "scores.$[element].value": 100 } },
{ arrayFilters: [ { "element.subject": "math" } ] }
)

Practical Examples

Example 1: E-commerce Inventory Management

When a customer purchases an item, you need to decrease the inventory count and record the sale:

javascript
db.products.updateOne(
{ _id: ObjectId("5f7d1b25c9b6132f9c763270") },
{
$inc: { inventory: -1 },
$push: {
sales: {
date: new Date(),
amount: 29.99,
customer_id: ObjectId("5f7d1b25c9b6132f9c76326a")
}
}
}
)

Example 2: User Profile Updates

When users update their profiles, you might need to modify multiple fields:

javascript
db.users.updateOne(
{ _id: ObjectId("5f7d1b25c9b6132f9c76326a") },
{
$set: {
"profile.name": "John D. Smith",
"profile.bio": "Software engineer and MongoDB enthusiast",
"settings.notifications": true,
last_updated: new Date()
},
$push: {
profile_updates: {
timestamp: new Date(),
fields_changed: ["name", "bio", "notification_settings"]
}
}
}
)

Example 3: Data Migration Script

When migrating data or fixing data issues, you might need to update many documents:

javascript
// Add a default value for a new field
db.customers.updateMany(
{ status: { $exists: true } },
{ $set: { account_type: "standard" } }
)

// Fix malformed email addresses
db.customers.updateMany(
{ email: /\s+/ },
[
{ $set: { email: { $trim: { input: "$email" } } } }
]
)

Summary

MongoDB's update operations provide powerful ways to modify data in your collections. You can:

  • Update single or multiple documents with updateOne() and updateMany()
  • Replace entire documents with replaceOne()
  • Use various update operators like $set, $inc, $push, and many more
  • Update nested fields using dot notation
  • Update array elements by position or by query with arrayFilters
  • Perform complex updates with options like upsert

Understanding these operations is essential for building applications that interact with MongoDB, as data modification is a common requirement in most applications.

Additional Resources

To deepen your understanding of MongoDB update operations:

  1. Practice the following exercises:

    • Update a document with multiple fields
    • Use $inc to track page views on a website
    • Use $push and $addToSet to manage tags in a blog post
    • Implement a "soft delete" using status field updates
  2. Explore the MongoDB documentation for more update operators and examples.

  3. Learn about transactions in MongoDB for cases where you need to update multiple collections atomically.

Exercises

  1. Create a collection named blog_posts with a few documents containing title, author, content, and tags fields. Use update operations to:

    • Add new tags to a post
    • Increment a view_count field
    • Update the author's information
  2. Implement a function that "soft deletes" a document by setting an is_deleted flag to true rather than removing the document.

  3. Create a script that updates prices for all products in a specific category, increasing them by 5%.



If you spot any mistakes on this website, please let me know at [email protected]. I’d greatly appreciate your feedback! :)