OPTIONS

db.collection.findOneAndUpdate()

On this page

Definition

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

New in version 3.2.

Updates a single document based on the filter and sort criteria.

The findOneAndUpdate() method has the following form:

db.collection.findOneAndUpdate(
   <filter>,
   <update>,
   {
     projection: <document>,
     sort: <document>,
     maxTimeMS: <number>,
     upsert: <boolean>,
     returnNewDocument: <boolean>
   }
)

The findOneAndUpdate() method takes the following parameters:

Parameter Type Description
filter document

The selection criteria for the update. The same query selectors as in the find() method are available.

Specify an empty document { } to update the first document returned in the collection.

update document

The update document.

Must contain only update operators.

The <replacement> document cannot specify an _id value that differs from the replaced document.

projection document

Optional. A subset of fields to return.

To return all fields in the returned document, omit this parameter.

sort document

Optional. Specifies a sorting order for the documents matched by the filter.

See cursor.sort().

maxTimeMS number Optional. Specifies a time limit in milliseconds within which the operation must complete within. Throws an error if the limit is exceeded.
upsert boolean

Optional. When true, findOneAndUpdate() creates a new document if no document matches the filter. If a document matches the filter, the method performs an update.

The new document is created using the equality conditions from the filter with the modifications from the update document.

Comparison conditions like $gt or $lt are ignored.

Returns null after inserting the new document, unless returnNewDocument is true.

Defaults to false.

returnNewDocument boolean

Optional. When true, returns the replacement document instead of the original document.

Defaults to false.

Returns:Returns either the original document or, if returnNewDocument: true, the updated document.

Behavior

findOneAndUpdate() updates the first matching document in the collection that matches the filter. The sort parameter can be used to influence which document is updated.

The projection parameter takes a document in the following form:

{ field1 : < boolean >, field2 : < boolean> ... }

The <boolean> value can be any of the following:

  • 1 or true to include the field. The method returns the _id field even if it is not explicitly stated in the projection parameter.
  • 0 or false to exclude the field. This can be used on any field, including _id.

Examples

Replace A Document

The grades collection contains documents similar to the following:

{ _id: 6305, name : "A. MacDyver", "assignment" : 5, "points" : 24 },
{ _id: 6308, name : "B. Batlock", "assignment" : 3, "points" : 22 },
{ _id: 6312, name : "M. Tagnum", "assignment" : 5, "points" : 30 },
{ _id: 6319, name : "R. Stiles", "assignment" : 2, "points" : 12 },
{ _id: 6322, name : "A. MacDyver", "assignment" : 2, "points" : 14 },
{ _id: 6234, name : "R. Stiles", "assignment" : 1, "points" : 10 }

The following operation finds the first document where name : R. Stiles and increments the score by 5:

db.scores.findOneAndUpdate(
   { "name" : "R. Stiles" },
   { $inc: { "points" : 5 } }
)

The operation returns the original document that has been replaced:

{ _id: 6319, name: "R. Stiles", "assignment" : 2, "points" : 12 }

If returnNewDocument was true, the operation would return the replacement document instead.

Sort And Update A Document

The grades collection contains documents similar to the following:

{ _id: 6305, name : "A. MacDyver", "assignment" : 5, "points" : 24 },
{ _id: 6308, name : "B. Batlock", "assignment" : 3, "points" : 22 },
{ _id: 6312, name : "M. Tagnum", "assignment" : 5, "points" : 30 },
{ _id: 6319, name : "R. Stiles", "assignment" : 2, "points" : 12 },
{ _id: 6322, name : "A. MacDyver", "assignment" : 2, "points" : 14 },
{ _id: 6234, name : "R. Stiles", "assignment" : 1, "points" : 10 }

The following operation updates a document where name : "A. MacGyver". The operation sorts the matching documents by points ascending to update the matching document with the least points.

db.scores.findOneAndUpdate(
   { "name" : "A. MacDyver" },
   { $inc : { "points" : 5 } },
   { sort : { "points" : 1 } }
)

The operation returns the original document that has been replaced:

{ _id: 6322, name: "A. MacDyver", "assignment" : 2, "points" : 14 }

Project the Returned Document

The following operation uses projection to only display the _id, points, and assignment fields in the returned document:

db.scores.findOneAndUpdate(
   { "name" : "A. MacDyver" },
   { $inc : { "points" : 5 } },
   { sort : { "points" : 1 }, projection: { "assignment" : 1, "points" : 1 } }
)

The operation returns the original document with only the assignment field:

{ "_id" : 6322, "assignment" : 2, "points" : 14 }

Update Document with Time Limit

The following operation sets a 5ms time limit to complete the update:

try {
   db.scores.findOneAndUpdate(
      { "name" : "A. MacDyver" },
      { $inc : { "points" : 5 } },
      { sort: { "points" : 1 }, maxTimeMS : 5 };
   );
}
catch(e){
   print(e);
}

If the operation exceeds the time limit, it returns:

Error: findAndModifyFailed failed: { "ok" : 0, "errmsg" : "operation exceeded time limit", "code" : 50 }

Update Document with Upsert

The following operation uses the upsert field to insert the update document if nothing matches the filter:

try {
db.scores.findOneAndUpdate(
   { "name" : "A.B. Abracus" },
   { $set: { "name" : "A.B. Abracus", "assignment" : 5}, $inc : { "points" : 5 } },
   { sort: { "points" : 1 }, returnNewDocument : true }
);
}
catch (e){
   print(e);
}

The operation returns the following:

{
     "_id" : 5239,
     "name" : "A.B. Abracus",
     "assignment" : 5,
   "points" : 5
}

If returnNewDocument was false, the operation would return null as there is no original document to return.