Docs HomeMongoDB Manual

db.collection.findOne()

Definition定义

db.collection.findOne(query, projection, options)
Important

mongosh Method

This page documents a mongosh method. This is not the documentation for database commands or language-specific drivers, such as Node.js.

For the database command, see the find command.

For MongoDB API drivers, refer to the language-specific MongoDB driver documentation.

For the legacy mongo shell documentation, refer to the documentation for the corresponding MongoDB Server release:

mongo shell v4.4

Returns one document that satisfies the specified query criteria on the collection or view. 返回一个满足集合或视图中指定查询条件的文档。If multiple documents satisfy the query, this method returns the first document according to the natural order which reflects the order of documents on the disk. 如果多个文档满足查询,此方法将根据反映文档在磁盘上的顺序的自然顺序返回第一个文档。In capped collections, natural order is the same as insertion order. 封顶集合中,自然顺序与插入顺序相同。If no document satisfies the query, the method returns null.如果没有文档满足查询,则该方法返回null

Parameter参数Type类型Description描述
querydocumentOptional.可选的。Specifies query selection criteria using query operators.使用查询运算符指定查询选择条件。
projectiondocumentOptional.可选的。Specifies the fields to return using projection operators. 指定要使用投影运算符返回的字段。Omit this parameter to return all fields in the matching document. 省略此参数可返回匹配文档中的所有字段。For details, see Projection.有关详细信息,请参阅投影
optionsdocumentOptional.可选的。Specifies additional options for the query. 指定查询的其他选项。These options modify query behavior and how results are returned. 这些选项修改查询行为以及返回结果的方式。To see available options, see FindOptions.要查看可用选项,请参阅FindOptions
Returns:返回值:One document that satisfies the criteria specified as the first argument to this method. 一个满足指定条件的文档,作为此方法的第一个参数。If you specify a projection parameter, findOne() returns a document that only contains the projection fields. 如果指定了projection参数,findOne()将返回一个仅包含projection字段的文档。The _id field is always included unless you explicitly exclude it._id字段始终包含在内,除非您明确排除它。Although similar to the find() method, the findOne() method returns a document rather than a cursor. 尽管与find()方法类似,findOne()方法返回的是文档而不是游标。

Behavior行为

Client Disconnection客户端断开连接

Starting in MongoDB 4.2, if the client that issued db.collection.findOne() disconnects before the operation completes, MongoDB marks db.collection.findOne() for termination using killOp.从MongoDB 4.2开始,如果发出db.collection.findOne()的客户端在操作完成前断开连接,MongoDB会使用killOp标记db.collection.findOne()终止。

Projection投影

Important

Language Consistency语言一致性

Starting in MongoDB 4.4, as part of making find() and findAndModify() projection consistent with aggregation's $project stage,从MongoDB 4.4开始,作为使find()findAndModify()投影与聚合的$project阶段一致的一部分,

The projection parameter determines which fields are returned in the matching documents. The projection parameter takes a document of the following form:projection参数确定在匹配的文档中返回哪些字段。projection参数采用以下形式的文档:

{ field1: <value>, field2: <value> ... }
Projection投影Description描述
<field>: <1 or true>Specifies the inclusion of a field. 指定包含字段。If you specify a non-zero integer for the projection value, the operation treats the value as true.如果为投影值指定非零整数,则操作会将该值视为true
<field>: <0 or false>Specifies the exclusion of a field.指定字段的排除。
"<field>.$": <1 or true>Uses the $ array projection operator to return the first element that matches the query condition on the array field. 使用$数组投影运算符返回与数组字段上的查询条件匹配的第一个元素。If you specify a non-zero integer for the projection value, the operation treats the value as true.如果为投影值指定非零整数,则操作会将该值视为true
Not available for views. 不可用于视图
<field>: <array projection>Uses the array projection operators ($elemMatch, $slice) to specify the array elements to include.使用数组投影运算符($elemMatch$slice)指定要包含的数组元素。
Not available for views. 不可用于视图
<field>: <$meta expression>Uses the $meta operator expression to specify the inclusion of available per-document metadata.使用$meta运算符表达式指定包含每个文档可用的元数据
Not available for views. 不可用于视图
<field>: <aggregation expression>Specifies the value of the projected field.指定投影场的值。
Starting in MongoDB 4.4, 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. 从MongoDB 4.4开始,通过使用聚合表达式和语法,包括使用文字和聚合变量,您可以投影新字段或使用新值投影现有字段。
  • If you specify a non-numeric, non-boolean literal (such as a literal string or an array or an operator expression) for the projection value, the field is projected with the new value, for example: 如果为投影值指定非数字、非布尔文字(如文字字符串、数组或运算符表达式),则字段将使用新值进行投影,例如:
    • { field: [ 1, 2, 3, "$someExistingField" ] }
    • { field: "New String Value" }
    • { field: { status: "Active", total: { $sum: "$existingArray" } } }
  • To project a literal value for a field, use the $literal aggregation expression; for example: 若要为字段投影文字值,请使用$literal聚合表达式;例如:
    • { field: { $literal: 5 } }
    • { field: { $literal: true } }
    • { field: { $literal: { fieldWithValue0: 0, fieldWithValue1: 1 } } }
In versions 4.2 and earlier, any specification value (with the exception of the previously unsupported document value) is treated as either true or false to indicate the inclusion or exclusion of the field. 在版本4.2及更早版本中,任何规范值(以前不支持的文档值除外)都被视为truefalse,以指示包含或排除字段。
New in version 4.4. 4.4版新增。

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> } } (Starting in MongoDB 4.4)从MongoDB 4.4开始

_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._id字段默认包含在返回的文档中,除非您在投影中明确指定_id:0以取消显示该字段。

Inclusion or Exclusion包含或排除

A projection cannot contain both include and exclude specifications, with the exception of the _id field:projection不能同时包含include和exclude规范,_id字段除外:

  • In projections that explicitly include fields, the _id field is the only field that you can explicitly exclude.显式包含字段的投影中,_id字段是唯一可以显式排除的字段。
  • In projections that explicitly excludes fields, the _id field is the only field that you can explicitly include; however, the _id field is included by default.显式排除字段的投影中,_id字段是唯一可以显式包含的字段;但是,_id字段在默认情况下是包含在内的。

For more information on projection, see also:有关投影的更多信息,另请参见:

Examples实例

With Empty Query Specification带有空查询规范

The following operation returns a single document from the bios collection:以下操作从bios集合返回单个文档:

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'):以下操作返回bios集合中的first匹配文档,其中嵌入文档名称中第一个字段以字母G开头,或者字段birth小于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. projection参数指定要返回的字段。The parameter contains either include or exclude specifications, not both, unless the exclude is for the _id field.参数包含include或exclude规范,而不是两者都包含,除非exclude用于_id字段。

Specify the Fields to Return指定要返回的字段

The following operation finds a document in the bios collection and returns only the name, contribs and _id fields:以下操作在bios集合中查找文档,并仅返回namecontribs_id字段:

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:以下操作返回bios集合中的一个文档,其中contribs字段包含元素OOP,并返回除_id字段、name嵌入文档中的第一个字段和birth字段之外的所有字段:

db.bios.findOne(
{ contribs: 'OOP' },
{ _id: 0, 'name.first': 0, birth: 0 }
)

The findOne Result DocumentfindOne结果文档

You cannot apply cursor methods to the result of findOne() because a single document is returned. 不能将游标方法应用于findOne()的结果,因为只返回了一个文档。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 Optionlet选项中使用变量

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. 例如,要定义可以在findOne方法的其他地方访问的变量,请使用let选项。To filter results using a variable, you must access the variable within the $expr operator.若要使用变量筛选结果,必须访问$expr运算符中的变量。

Create a collection cakeFlavors:创建一个集合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:以下示例在let中定义了targetFlavor变量,并使用该变量检索巧克力蛋糕的风味:

db.cakeFlavors.findOne(
{ $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } },
{ _id: 0 },
{ let : { targetFlavor: "chocolate" }
} )

Output:输出:

{ flavor: 'chocolate' }

To see all available query options, see FindOptions.要查看所有可用的查询选项,请参阅FindOptions