- Reference >
- JavaScript Methods >
- db.collection.findAndModify()
db.collection.findAndModify()¶
-
db.collection.findAndModify()¶ The
findAndModify()method atomically modifies and returns a single document. By default, the returned document does not include the modifications made on the update. To return the document with the modifications made on the update, use thenewoption. ThefindAndModify()method is a shell helper around thefindAndModifycommand.The
db.collection.findAndModify()method takes a document parameter with the following subdocument fields:Fields: - query (document) – Optional. Specifies the selection criteria for the
modification. The
queryfield employs the same query selectors as used in thedb.collection.find()method. Although the query may match multiple documents,findAndModify()will only select one document to modify. - sort (document) – Optional. Determines which document the operation will modify
if the query selects multiple documents.
findAndModify()will modify the first document in the sort order specified by this argument. - remove (boolean) – Optional if
updatefield exists. Whentrue, removes the selected document. The default isfalse. - update (document) – Optional if
removefield exists. Performs an update of the selected document. Theupdatefield employs the same update operators orfield: valuespecifications to modify the selected document. - new (boolean) – Optional. When
true, returns the modified document rather than the original. ThefindAndModify()method ignores thenewoption forremoveoperations. The default isfalse. - fields (document) –
Optional. A subset of fields to return. The
fieldsdocument specifies an inclusion of a field with1, as in the following:See projection.
- upsert (boolean) – Optional. Used in conjunction with the
updatefield. Whentrue,findAndModify()creates a new document if thequeryreturns no documents. The default isfalse.
The
findAndModify()method returns either:- the pre-modification document or,
- if the
new: trueoption is set, the modified document.
Note
If no document is found for the
updateorremove, the method returnsnull.If no document is found for an
upsert, which means the command performs an insert, andnewisfalse, and thesortoption is NOT specified, the method returnsnull.Changed in version 2.2: Previously returned an empty document
{}. See the 2.2 release notes for more information.If no document is found for an
upsert, which means the command performs an insert, andnewisfalse, and asortoption is specified, the method returns an empty document{}.
Consider the following examples:
The following method updates an existing document in the people collection where the document matches the query criteria:
This method performs the following actions:
The
queryfinds a document in thepeoplecollection where thenamefield has the valueTom, thestatefield has the valueactiveand theratingfield has a valuegreater than10.The
sortorders the results of the query in ascending order. If multiple documents meet thequerycondition, the method will select for modification the first document as ordered by thissort.The update
incrementsthe value of thescorefield by 1.The method returns the original (i.e. pre-modification) document selected for this update:
To return the modified document, add the
new:trueoption to the method.If no document matched the
querycondition, the method returnsnull:
The following method includes the
upsert: trueoption to insert a new document if no document matches thequerycondition:If the method does not find a matching document, the method performs an upsert. Because the method included the
sortoption, it returns an empty document{ }as the original (pre-modification) document:If the method did not include a
sortoption, the method returnsnull.The following method includes both the
upsert: trueoption and thenew:trueoption to return the newly inserted document if a document matching thequeryis not found:
The method returns the newly inserted document:
When
findAndModify()includes theupsert: trueoption and the query field(s) is not uniquely indexed, the method could insert a document multiple times in certain circumstances. For instance, if multiple clients each invoke the method with the samequerycondition and these methods complete thefindphase before any of methods perform themodifyphase, these methods could insert the same document.Consider an example where no document with the name
Andyexists and multiple clients issue the following command:If all the methods finish the
queryphase before any command starts themodifyphase, and there is no unique index on thenamefield, the commands may all perform an upsert. To prevent this condition, create a unique index on thenamefield. With the unique index in place, the multiple methods would observe one of the following behaviors:- Exactly one
findAndModify()would successfully insert a new document. - Zero or more
findAndModify()methods would update the newly inserted document. - Zero or more
findAndModify()methods would fail when they attempted to insert a duplicate. If the method fails due to a unique index constraint violation, you can retry the method. Absent a delete of the document, the retry should not fail.
Warning
- When using
findAndModifyin a sharded environment, thequerymust contain the shard key for all operations against the shard cluster.findAndModifyoperations issued againstmongosinstances for non-sharded collections function normally.
- query (document) – Optional. Specifies the selection criteria for the
modification. The