Update Multiple Documents using updateMany() in MongoDB for expert

0 0
Read Time:5 Minute, 21 Second

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: "john.king@abc.com",
        salary: 5000
    },
    { 
        _id:2,
        firstName: "Sachin",
        lastName: "T",
        email: "sachin.t@abc.com",
        salary: 8000
    },
    { 
        _id:3,
        firstName: "James",
        lastName: "Bond",
        email: "jamesb@abc.com",
        salary: 7500
    },
    { 
        _id:4,
        firstName: "Steve",
        lastName: "J",
        email: "steve.j@abc.com",
        salary: 7000
    },
    { 
        _id:5,
        firstName: "Kapil",
        lastName: "D",
        email: "kapil.d@abc.com",
        salary: 4500
    },
    { 
        _id:6,
        firstName: "Amitabh",
        lastName: "B",
        email: "amitabh.b@abc.com",
        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: 'john.king@abc.com',
    salary: 5000
  },
  {
    _id: 2,
    firstName: 'Sachin',
    lastName: 'T',
    email: 'sachin.t@abc.com',
    salary: 8000
  },
  {
    _id: 3,
    firstName: 'James',
    lastName: 'Bond',
    email: 'jamesb@abc.com',
    salary: 7500
  },
  {
    _id: 4,
    firstName: 'Steve',
    lastName: 'J',
    email: 'steve.j@abc.com',
    salary: 8500
  },
  {
    _id: 5,
    firstName: 'Kapil',
    lastName: 'D',
    email: 'kapil.d@abc.com',
    salary: 4500
  },
  {
    _id: 6,
    firstName: 'Amitabh',
    lastName: 'B',
    email: 'amitabh.b@abc.com',
    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: "steve.j@abc.com",
    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 Copy

db.employees.updateMany({_id:2}, { $set: {lastName:"Tendulkar", email:"sachin.tendulkar@abc.com"}}) 

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: "sachin.tendulkar@abc.com",
    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.

MethodDescription
$currentDateSets the value of a field to current date, either as a Date or a Timestamp.
$incIncrements the value of the field by the specified amount.
$minOnly updates the field if the specified value is less than the existing field value.
$maxOnly updates the field if the specified value is greater than the existing field value.
$mulMultiplies the value of the field by the specified amount.
$renameRenames a field.
$setSets the value of a field in a document.
$setOnInsertSets 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.
$unsetRemoves the specified field from a document.

Visit Update Operators on MongoDB documentation.

Happy
Happy
0 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
0 %

Average Rating

5 Star
0%
4 Star
0%
3 Star
0%
2 Star
0%
1 Star
0%

One thought on “Update Multiple Documents using updateMany() in MongoDB for expert

Leave a Comment