MongoDB with drivers
This page documents a mongosh method. To see the equivalent
method in a MongoDB driver, see the corresponding page for your
programming language:
Definition
db.collection.findOne(query, projection, options)Returns one document that satisfies the specified query criteria on the collection or view.
The returned document may vary depending on the number of documents that match the query criteria, and the query plan used:
Number of matching documentsQuery planResult0
Any
The method returns
null1
Any
The method returns the document that satisfies the specified query criteria.
2 or more
Collection Scan
The method returns the first document according to the natural order. In capped collections, natural order is the same as insertion order.
2 or more
Index Scan
The method returns the first document retrieved from the index.
Important
If the query plan changes to use a different index, the method may return a different document. If your use case requires that a particular record is chosen consistently, you must use the
optionsdocument to specify a sort. For details on usingfindOne()with anoptionsdocument, see the example.If you specify a
projectionparameter,findOne()returns a document that only contains theprojectionfields. The_idfield is always included unless you explicitly exclude it.
Compatibility
This method is available in deployments hosted in the following environments:
MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud
Note
This command is supported in all MongoDB Atlas clusters. For information on Atlas support for all commands, see Unsupported Commands.
MongoDB Enterprise: The subscription-based, self-managed version of MongoDB
MongoDB Community: The source-available, free-to-use, and self-managed version of MongoDB
Syntax
The findOne() method has the following
form:
db.collection.findOne( <query>, <projection>, <options> )
The findOne() method takes the following
parameters:
Parameter | Type | Description |
|---|---|---|
| document | Optional. Specifies query selection criteria using query operators. |
| document | Optional. Specifies the fields to return using projection operators. Omit this parameter to return all fields in the matching document. For details, see Projection. |
| document | Optional. Specifies additional options for the query. These options modify query behavior and how results are returned. To see available options, see FindOptions. |
Behavior
Client Disconnection
If the client that issued db.collection.findOne() disconnects before the operation
completes, MongoDB marks db.collection.findOne() for termination using
killOp.
Projection
Important
Language Consistency
As part of making find() and
findAndModify() projection consistent with
aggregation's $project stage:
The
find()andfindAndModify()projection can accept aggregation expressions and syntax.MongoDB enforces additional restrictions with regards to projections. See Projection Restrictions for details.
The projection parameter determines which fields are returned in
the matching documents. The projection parameter takes a document
of the following form:
{ field1: <value>, field2: <value> ... }
Projection | Description |
|---|---|
| Specifies the inclusion of a field. If you specify a non-zero
integer for the projection value, the operation treats the
value as |
| Specifies the exclusion of a field. |
| |
| Uses the array projection operators ( Not available for views. |
| Uses the Not available for views. |
| Specifies the value of the projected field. With the use of aggregation expressions and syntax, including the use of literals and aggregation variables, you can project new fields or project existing fields with new values.
|
Note
You can specify projection in two ways for find()
and findOne():
Setting the
projectionparameterSetting the
optionsparameter toprojection
If you specify both parameters, the projection parameter takes precedence. To use
options.projection, set the projection parameter to null or
undefined.
Embedded Field Specification
For fields in an embedded documents, you can specify the field using either:
dot notation, for example
"field.nestedfield": <value>nested form, for example
{ field: { nestedfield: <value> } }
_id Field Projection
The _id field is included in the returned documents by default unless
you explicitly specify _id: 0 in the projection to suppress the field.
Inclusion or Exclusion
A projection cannot contain both include and exclude
specifications, with the exception of the _id field:
In projections that explicitly include fields, the
_idfield is the only field that you can explicitly exclude.In projections that explicitly excludes fields, the
_idfield is the only field that you can explicitly include; however, the_idfield is included by default.
For more information on projection, see also:
Examples
With Empty Query Specification
The following operation returns a single document from the bios collection:
db.bios.findOne()
With a Query Specification
The following operation returns the first matching document from the
bios collection where either the field first in the embedded
document name starts with the letter G or where the field
birth is less than new
Date('01/01/1945'):
db.bios.findOne( { $or: [ { 'name.first' : /^G/ }, { birth: { $lt: new Date('01/01/1945') } } ] } )
With a Projection
The projection parameter specifies which fields to return. The
parameter contains either include or exclude specifications, not both,
unless the exclude is for the _id field.
Specify the Fields to Return
The following operation finds a document in the bios collection and
returns only the name, contribs and _id fields:
db.bios.findOne( { }, { name: 1, contribs: 1 } )
Return All but the Excluded Fields
The following operation returns a document in the bios collection
where the contribs field contains the element OOP and returns
all fields except the _id field, the first field in the
name embedded document, and the birth field:
db.bios.findOne( { contribs: 'OOP' }, { _id: 0, 'name.first': 0, birth: 0 } )
With an Option
The following operation uses the sort option to return the first
matching document from the sorted bios collection. In this example,
the collection is sorted by birth in ascending order.
db.bios.findOne( { }, { }, { sort: { birth: 1 } } )
The findOne Result Document
You cannot apply cursor methods to the result of
findOne() because a single document is
returned. You have access to the document directly:
var myDocument = db.bios.findOne(); if (myDocument) { var myName = myDocument.name; print (tojson(myName)); }
Use Variables in let Option
You can specify query options to modify query behavior and indicate how results are returned.
For example, to define variables that you can access elsewhere in the
findOne method, use the let option. To filter results using a
variable, you must access the variable within the $expr
operator.
Create a collection cakeFlavors:
db.cakeFlavors.insertMany( [ { _id: 1, flavor: "chocolate" }, { _id: 2, flavor: "strawberry" }, { _id: 3, flavor: "cherry" } ] )
The following example defines a targetFlavor variable in let and
uses the variable to retrieve the chocolate cake flavor:
db.cakeFlavors.findOne( { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } }, { _id: 0 }, { let : { targetFlavor: "chocolate" } } )
Output:
{ flavor: 'chocolate' }
To see all available query options, see FindOptions.