MongoDB Update Document

MongoDB provides multiple methods for updating documents, allowing you to update single or multiple documents.

Update Single Document

updateOne() Method

db.collection.updateOne(filter, update, options)

Basic Example

// Update first matching document
db.users.updateOne(
  { name: "John" },
  { $set: { age: 26, updatedAt: new Date() } }
)

Return Result

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

Update Multiple Documents

updateMany() Method

db.collection.updateMany(filter, update, options)

Basic Example

// Update all matching documents
db.users.updateMany(
  { status: "inactive" },
  { $set: { status: "active" } }
)

Update Operators

$set - Set Field Value

// Set single field
db.users.updateOne(
  { name: "John" },
  { $set: { age: 26 } }
)

// Set multiple fields
db.users.updateOne(
  { name: "John" },
  { $set: { age: 26, city: "Boston" } }
)

// Set nested field
db.users.updateOne(
  { name: "John" },
  { $set: { "address.city": "Boston" } }
)

// Set array element
db.users.updateOne(
  { name: "John" },
  { $set: { "tags.0": "VIP" } }
)

$unset - Remove Field

// Remove field
db.users.updateOne(
  { name: "John" },
  { $unset: { tempField: "" } }
)

// Remove multiple fields
db.users.updateOne(
  { name: "John" },
  { $unset: { tempField: "", oldField: "" } }
)

$inc - Increment Value

// Increment value
db.users.updateOne(
  { name: "John" },
  { $inc: { age: 1 } }  // age + 1
)

// Decrement value
db.users.updateOne(
  { name: "John" },
  { $inc: { age: -1 } }  // age - 1
)

// Increment multiple fields
db.products.updateOne(
  { name: "iPhone" },
  { $inc: { stock: -1, sold: 1 } }
)

$mul - Multiply Value

// Multiply value
db.products.updateOne(
  { name: "iPhone" },
  { $mul: { price: 0.9 } }  // 10% discount
)

$rename - Rename Field

// Rename field
db.users.updateMany(
  {},
  { $rename: { "oldName": "newName" } }
)

Array Operators

$push - Add Element to Array

// Add single element
db.users.updateOne(
  { name: "John" },
  { $push: { tags: "VIP" } }
)

// Add multiple elements
db.users.updateOne(
  { name: "John" },
  { $push: { tags: { $each: ["VIP", "Premium"] } } }
)

// Add to specific position
db.users.updateOne(
  { name: "John" },
  { $push: { tags: { $each: ["New"], $position: 0 } } }
)

// Sort and limit
db.users.updateOne(
  { name: "John" },
  { $push: { scores: { $each: [85], $sort: -1, $slice: 3 } } }
)

$addToSet - Add to Set (No Duplicates)

// Add unique element
db.users.updateOne(
  { name: "John" },
  { $addToSet: { tags: "VIP" } }
)

// Add multiple unique elements
db.users.updateOne(
  { name: "John" },
  { $addToSet: { tags: { $each: ["VIP", "Premium", "VIP"] } } }
)

$pop - Remove Array Element

// Remove last element
db.users.updateOne(
  { name: "John" },
  { $pop: { tags: 1 } }
)

// Remove first element
db.users.updateOne(
  { name: "John" },
  { $pop: { tags: -1 } }
)

$pull - Remove Specified Element

// Remove specified value
db.users.updateOne(
  { name: "John" },
  { $pull: { tags: "VIP" } }
)

// Remove multiple values
db.users.updateOne(
  { name: "John" },
  { $pull: { tags: { $in: ["VIP", "Premium"] } } }
)

// Remove by condition
db.users.updateOne(
  { name: "John" },
  { $pull: { scores: { $lt: 60 } } }
)

$pullAll - Remove All Specified Values

db.users.updateOne(
  { name: "John" },
  { $pullAll: { tags: ["VIP", "Premium"] } }
)

Replace Document

replaceOne() Method

db.users.replaceOne(
  { name: "John" },
  {
    name: "John",
    age: 26,
    city: "Boston"
    // Note: _id is not replaced
  }
)

Update Options

upsert - Insert if Not Exists

db.users.updateOne(
  { name: "New User" },
  { $set: { age: 20, createdAt: new Date() } },
  { upsert: true }
)

writeConcern

db.users.updateOne(
  { name: "John" },
  { $set: { age: 26 } },
  {
    writeConcern: {
      w: "majority",
      j: true,
      wtimeout: 5000
    }
  }
)

Bulk Update

Bulk Operations

var bulk = db.users.initializeUnorderedBulkOp()

bulk.find({ name: "John" }).updateOne({ $set: { age: 26 } })
bulk.find({ name: "Jane" }).updateOne({ $set: { age: 31 } })
bulk.find({ status: "inactive" }).update({ $set: { status: "active" } })

bulk.execute()

Update Examples

Comprehensive Example

// Update user info and add operation log
db.users.updateOne(
  { _id: ObjectId("...") },
  {
    $set: {
      lastLogin: new Date(),
      loginCount: 1
    },
    $inc: { loginCount: 1 },
    $push: {
      loginHistory: {
        $each: [{ time: new Date(), ip: "192.168.1.1" }],
        $slice: -10  // Keep only last 10 entries
      }
    }
  }
)

Summary

Key points for updating documents:

  • updateOne() for single document updates
  • updateMany() for multiple document updates
  • replaceOne() to replace entire document
  • Use various operators for different update needs
  • upsert can "update if exists, insert if not"

In the next chapter, we will learn about MongoDB Delete Document.