find

在本页面

Definition

  • find
    • 3.2 版中的新功能。

执行查询并返回第一批结果和游标 ID,Client 端可以从中构造游标。

Tip

您可以使用mongo shell 中提供的db.collection.find()帮助程序或驱动程序中的等效帮助程序,而不是直接运行find命令。

Syntax

find命令具有以下语法:

db.runCommand(
   {
      "find": <string>,
      "filter": <document>,
      "sort": <document>,
      "projection": <document>,
      "hint": <document or string>,
      "skip": <int>,
      "limit": <int>,
      "batchSize": <int>,
      "singleBatch": <bool>,
      "comment": <string>,
      "maxScan": <int>,
      "maxTimeMS": <int>,
      "readConcern": <document>,
      "max": <document>,
      "min": <document>,
      "returnKey": <bool>,
      "showRecordId": <bool>,
      "tailable": <bool>,
      "oplogReplay": <bool>,
      "noCursorTimeout": <bool>,
      "awaitData": <bool>,
      "allowPartialResults": <bool>,
      "collation": <document>
   }
)

Command Fields

该命令接受以下字段:

FieldTypeDescription
findstring集合的名称或要查询的view
filterdocument可选的。查询谓词。如果未指定,则集合中的所有文档都将与谓词匹配。
sortdocument可选的。结果排序的排序规范。
projectiondocument可选的。 projection specification确定要包含在返回的文档中的字段。参见从查询返回的项目字段Projection Operators

视图上的find()操作不支持以下projection运算符:
$
$elemMatch
$slice
$meta
hint字符串或文档可选。索引规格。将索引名称指定为字符串或索引键模式。如果指定,则查询系统将仅使用提示索引考虑计划。
skip正整数可选。要跳过的文档数。默认为 0.
limit非负整数可选。返回的最大文件数。如果未指定,则默认为无限制。限制为 0 等于没有设置限制。
batchSize非负整数可选。第一批中要返回的文档数。默认值为 101.batchSize 为 0 表示将构建光标,但是在第一批中将不返回任何文档。
与以前的有线协议版本不同,find命令的 batchSize 为 1 不会关闭游标。
singleBatch布尔值可选。确定是否在第一批之后关闭光标。默认为 false。
commentstring可选。附加到查询的 Comments,以帮助解释和跟踪查询profile数据。
maxScan正整数可选。执行查询时要扫描的最大文档或索引键数。
maxTimeMS正整数可选。光标上的处理操作的累积时间限制(以毫秒为单位)。 MongoDB 最早在interrupt point之后中止操作。

Tip





当指定线性化阅读关注时,如果大多数数据承载成员不可用,请始终使用maxTimeMSmaxTimeMS确保该操作不会无限期地阻塞,而是确保如果无法满足读取要求,则该操作将返回错误。



|
| readConcern |文档|可选。指定read concern

> readConcern 选项具有以下语法:

> 在版本 3.6 中更改。

> readConcern: { level: <value> }

> 可能的阅读关注级别为:

> "local"。这是默认的阅读关注级别。

> "available"。当未指定读取操作和因果一致的会话和“ level”时,这是针对次要对象的读取的默认值。查询返回实例的最新数据。

> "majority"。可用于使用WiredTiger 存储引擎的副本集。

> "linearizable"。仅可用于primary上的读取操作。

> 有关阅读关注级别的更多信息,请参阅阅读关注级别

> 对于"local"(默认)或"majority"读关注级别,您可以指定afterClusterTime选项以使读操作返回满足级别要求和在群集时间之后指定的数据。有关更多信息,请参见读取操作和因果一致的会话

> getMore命令使用原始find命令中指定的readConcern级别。
| max |文档|可选。特定索引的* exclusive 上限。有关详细信息,请参见cursor.max()
| min |文档|可选。特定索引的
含*下限。有关详细信息,请参见cursor.min()
| returnKey |布尔值|可选。如果为 true,则仅返回结果文档中的索引键。默认值为 false。如果 returnKey 为 true 并且find命令不使用索引,则返回的文档将为空。
| showRecordId |布尔值|可选。确定是否返回每个文档的记录标识符。如果为 true,则将字段$ recordId 添加到返回的文档中。
| tailable |布尔值|可选。返回一个上限为tailable cursor的集合。
| awaitData |布尔值|可选。如果在数据末尾而不是不返回数据,则与 tailable 选项结合使用可临时阻止光标上的getMore命令。超时后,find照常返回。
| oplogReplay |布尔值|可选。用于重播副本集的操作日志的内部命令。

> 要使用oplogReplayfind字段必须引用capped collection,并且您必须提供filter选项,使用以下比较运算符之一将ts document 字段与timestamp进行比较:

> $gte

> $gt

> $eq

> 例如,以下命令从data capped collection重放文档的时间戳晚于或等于 UTC 2018 年 1 月 1 日:

> {找到:“数据”,

> oplogReplay: true,

> 过滤器:{ ts: { $gte: new Timestamp(1514764800, 0) }}}

> 在版本 3.6 中更改:现在支持$eq
| noCursorTimeout |布尔值|可选。防止服务器在不活动时间(10 分钟)后使空闲的游标超时。
| allowPartialResults |布尔值|可选。对于针对分片集合的查询,如果一个或多个查询的分片不可用,则允许命令(或后续的getMore命令)返回部分结果,而不是错误。

> |
| collation |文档|可选。

> 指定用于操作的collation

> Collation允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。

> 排序规则选项具有以下语法:

> collation: {

> locale: <string>,

> caseLevel: <boolean>,

> caseFirst: <string>,

> strength: <int>,

> numericOrdering: <boolean>,

> alternate: <string>,

> maxVariable: <string>,

> backwards: <boolean>

> }

> 指定排序规则时,locale字段为必填字段;所有其他排序规则字段都是可选的。有关字段的说明,请参见Collation Document

> 如果未指定排序规则,但是集合具有默认排序规则(请参见db.createCollection()),则该操作将使用为集合指定的排序规则。

> 如果没有为集合或操作指定排序规则,则 MongoDB 使用先前版本中使用的简单二进制比较进行字符串比较。

> 您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果对排序执行查找,则不能对查找使用一种排序规则,而对排序使用另一种排序规则。

> 3.4 版中的新功能。

Output

该命令返回包含游标信息的文档,包括游标 ID 和第一批文档。例如,对分片集合运行时将返回以下文档:

{
   "cursor" : {
      "firstBatch" : [
         {
            "_id" : ObjectId("5e8e2ca217b5324fa9847435"),
            "zipcode" : "20001",
            "x" : 1
         },
         {
            "_id" : ObjectId("5e8e2ca517b5324fa9847436"),
            "zipcode" : "30001",
            "x" : 1
         }
      ],
      "id" : NumberLong("668860441858272439"),
      "ns" : "test.contacts"
   },
   "ok" : 1,
   "operationTime" : Timestamp(1586380205, 1),
   "$clusterTime" : {
      "clusterTime" : Timestamp(1586380225, 2),
      "signature" : {
         "hash" : BinData(0,"aI/jWsUVUSkMw8id+A+AVVTQh9Y="),
         "keyId" : NumberLong("6813364731999420435")
      }
   }
}
FieldDescription
cursor包含光标信息,包括文档的光标idfirstBatch
"ok"指示命令是成功(1)还是失败(0)。

除了前面提到的find特定字段之外,db.runCommand()还包括以下有关副本集和分片群集的信息:

  • $clusterTime

  • operationTime

有关详情,请参见db.runCommand() Results

Behavior

会话空闲超时

从 MongoDB 3.6 开始,MongoDB 驱动程序和mongo shell 将所有操作与server session关联,但未确认的写操作除外。对于未与会话明确关联的操作(即使用Mongo.startSession()),MongoDB 驱动程序和mongo Shell 创建隐式会话并将其与该操作相关联。

如果会话空闲时间超过 30 分钟,则 MongoDB 服务器会将会话标记为已过期,并可以随时关闭它。当 MongoDB 服务器关闭会话时,它还会终止所有正在进行的操作并打开与该会话关联的游标。这包括配置为noCursorTimeoutmaxTimeMS大于 30 分钟的光标。

对于返回游标的操作,如果游标可能闲置了 30 分钟以上,请在使用Session.startSession()的显式会话中发出操作,并使用refreshSessions命令定期刷新该会话。有关更多信息,请参见会话空闲超时

Examples

指定排序和限制

以下命令在rating字段和cuisine字段上运行find命令过滤。该命令包含projection,仅返回匹配文档中的以下字段:_idnameratingaddress字段。

该命令通过name字段对结果集中的文档进行排序,并将结果集限制为 5 个文档。

db.runCommand(
   {
     find: "restaurants",
     filter: { rating: { $gte: 9 }, cuisine: "italian" },
     projection: { name: 1, rating: 1, address: 1 },
     sort: { name: 1 },
     limit: 5
   }
)

覆盖默认读取问题

要覆盖默认的阅读关注级别"local",请使用readConcern选项。

对副本集的以下操作指定read concern"majority"来读取已确认已写入大多数节点的数据的最新副本。

要使用read concern级别"majority",副本集必须使用WiredTiger 存储引擎和选举协议版本 1

从 MongoDB 3.6 开始,默认情况下启用对读取关注"majority"的支持。对于 MongoDB 3.6.1-3.6.x,您可以禁用阅读关注"majority"。有关更多信息,请参见禁用多数阅读关注

db.runCommand(
   {
     find: "restaurants",
     filter: { rating: { $lt: 5 } },
     readConcern: { level: "majority" }
   }
)

无论read concern级别如何,节点上的最新数据都可能无法反映系统中数据的最新版本。

getMore命令使用在原始find命令中指定的readConcern级别。

可以使用cursor.readConcern方法为mongo shell 方法db.collection.find()指定readConcern

db.restaurants.find( { rating: { $lt: 5 } } ).readConcern("majority")

有关可用阅读关注点的更多信息,请参见Read Concern

Specify Collation

3.4 版的新功能。

Collation允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。

以下操作使用指定的排序规则运行find命令:

db.runCommand(
   {
     find: "myColl",
     filter: { category: "cafe", status: "a" },
     sort: { category: 1 },
     collation: { locale: "fr", strength: 1 }
   }
)

mongoShell 程序提供cursor.collation()db.collection.find()操作指定collation