Update Multiple Documents using updateMany() in MongoDB

Learn how to update multiple documents using the updateMany() method in MongoDB.

MongoDB provides the following methods to update existing documents in a collection:

In most cases, it is recommended to use the updateMany() method than the updateOne() method.

db.collection.updateMany()

Use the db.<collection>.updateMany() method to update multiple documents that matches with the specified filter criteria in a collection.

Syntax:

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

Parameters:

  1. filter: The selection criteria for the update, same as find() method.
  2. document: A document or pipeline that contains modifications to apply.
  3. options: Optional. May contains options for update behavior. It includes upsert, writeConcern, collation, etc.

In the above syntax, db points to the current database, <collection> points is an existing collection name.

To demonstrate the update operation, insert the following sample documents in the employees collection.

Sample Data
db.employees.insertMany([
    { 
        _id:1,
        firstName: "John",
        lastName: "King",
        email: "[email protected]",
        salary: 5000
    },
    { 
        _id:2,
        firstName: "Sachin",
        lastName: "T",
        email: "[email protected]",
        salary: 8000
    },
    { 
        _id:3,
        firstName: "James",
        lastName: "Bond",
        email: "[email protected]",
        salary: 7500
    },
    { 
        _id:4,
        firstName: "Steve",
        lastName: "J",
        email: "[email protected]",
        salary: 7000
    },
    { 
        _id:5,
        firstName: "Kapil",
        lastName: "D",
        email: "[email protected]",
        salary: 4500
    },
    { 
        _id:6,
        firstName: "Amitabh",
        lastName: "B",
        email: "[email protected]",
        salary: 7000
    }
])

The following modifies matching documents using the updateMany() method in employees collection.

Example: updateMany()
db.employees.updateMany({ salary:7000 }, { $set: { salary:8500 }}) 
Output
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 2,
  modifiedCount: 2,
  upsertedCount: 0
}

In the above example, the first parameter is the filter criteria specified as a document, { salary:7000 } indicates that find documents whose salary are 7000. The second parameter is used to specify fields and values to be modified on the matching document in the {<update-operator>: { field: value, field:value,... } format. Use the update operator to specify an action to perform. Here we want to set the value of fields, so use $set operator to specify fields and updated values in {field:updated-value} format. { $set: {salary:8500}} modifies the salary fields of all matching documents to 8500.

In the output, matchedCount indicates the number of documents that matched with the criteria, and modifiedCount indicates the number of documents updated.

Now, check whether it has updated a value or not using the find() method shown below.

Check Updated Document
db.employees.find() 
Output
[
  {
    _id: 1,
    firstName: 'John',
    lastName: 'King',
    email: '[email protected]',
    salary: 5000
  },
  {
    _id: 2,
    firstName: 'Sachin',
    lastName: 'T',
    email: '[email protected]',
    salary: 8000
  },
  {
    _id: 3,
    firstName: 'James',
    lastName: 'Bond',
    email: '[email protected]',
    salary: 7500
  },
  {
    _id: 4,
    firstName: 'Steve',
    lastName: 'J',
    email: '[email protected]',
    salary: 8500
  },
  {
    _id: 5,
    firstName: 'Kapil',
    lastName: 'D',
    email: '[email protected]',
    salary: 4500
  },
  {
    _id: 6,
    firstName: 'Amitabh',
    lastName: 'B',
    email: '[email protected]',
    salary: 8500
  }
]

The updateMany() method adds the specified field if it does not exist in a matching document. For example, the following will add the location field.

Example: updateMany()
db.employees.updateMany({firstName:"Steve"}, { $set: {location: "USA"}}) 
Output
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}

Execute the following find() method to see the updated data.

Check Updated Document
db.employees.find({firstName:"Steve"}) 
Output
{ 
    _id:4,
    firstName: "Steve",
    lastName: "J",
    email: "[email protected]",
    salary: 8500,
    location:"USA"
}

If you specify an empty filter criteria {}, then it will update all the documents. The following will update or add location field in all documents.

Example: updateMany()
db.employees.updateMany({}, { $set: {location: "USA"}}) 
Output
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 6,
  modifiedCount: 6,
  upsertedCount: 0
}

Use the $inc update operator to increase the value of the field by the specified amount. The following increases the salary by 500 whose salary is 8500.

Example: $inc Operator
db.employees.updateMany({salary:8500}, { $inc: {salary: 500}}) 
Output
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 2,
  modifiedCount: 2,
  upsertedCount: 0
}

Update Multiple Fields

You can also specify multiple fields to update. The following updates email and lastName fields.

Example: Update Multiple Fields
db.employees.updateMany({_id:2}, { $set: {lastName:"Tendulkar", email:"[email protected]"}}) 
Output
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}

Execute the following find() method to see the updated data.

Check Updated Document
db.employees.find({_id:2}) 
Output
{ 
    _id:2,
    firstName: "Sachin",
    lastName: "Tendulkar",
    email: "[email protected]",
    salary: 8000
}

The updateMany() method does not update any documents if no matching documents found. For example, the following will not update any documents.

Example: updateMany()
db.employees.updateMany({salary:100}, { $set: {salary:200}}) 
Output
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 0,
  modifiedCount: 0,
  upsertedCount: 0
}

Upsert - Add if not Exist

Specify {upsert:true} as a third parameter in the UpdateMany() method. The upsert:true adds a new document if the matching document does not found.

Example: Upsert
db.employees.updateMany({firstName:"Heer"}, { $set: {lastName:"Patel", salary:2000}}) 
Output
{
  acknowledged: true,
  insertedId: ObjectId("6172a2e9ce7d5ca09d6ab082"),
  matchedCount: 0,
  modifiedCount: 0,
  upsertedCount: 1
}

In the above example, MongoDB adds a new document with new _id, because it cannot find a document with the firstName:"Heer".

Update Operators

The following table lists the update operators which can be used with the updateOne() and updateMany() methods.

Method Description
$currentDate Sets the value of a field to current date, either as a Date or a Timestamp.
$inc Increments the value of the field by the specified amount.
$min Only updates the field if the specified value is less than the existing field value.
$max Only updates the field if the specified value is greater than the existing field value.
$mul Multiplies the value of the field by the specified amount.
$rename Renames a field.
$set Sets the value of a field in a document.
$setOnInsert Sets the value of a field if an update results in an insert of a document. Has no effect on update operations that modify existing documents.
$unset Removes the specified field from a document.

Visit Update Operators on MongoDB documentation.