MongoDB provides the following methods to update existing documents in a collection:
- db.collection.updateOne() – Modifies a single document in a collection.
- db.collection.updateMany() – Modifies one or more 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:
- filter: The selection criteria for the update, same as find() method.
- document: A document or pipeline that contains modifications to apply.
- 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.
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.
[…] can use the updateOne() or updateMany() methods in MongoDB to add, update, or remove array elements based on the specified criteria. It is […]