find
定义
find
执行查询,然后返回第一批结果和游标 ID,客户端可据此构造游标。
提示
在
mongosh
中,还可以通过db.collection.find()
或db.collection.findOne()
助手方法运行此命令。辅助方法对
mongosh
用户来说很方便,但它们返回的信息级别可能与数据库命令不同。如果不追求方便或需要额外的返回字段,请使用数据库命令。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
此命令在 M 0 、 M 2和 M 5集群中提供有限支持。 有关更多信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
find
命令采用以下语法:
5.0 版本中的更改。
db.runCommand( { find: <string>, filter: <document>, sort: <document>, projection: <document>, hint: <document or string>, skip: <int>, limit: <int>, batchSize: <int>, singleBatch: <bool>, comment: <any>, maxTimeMS: <int>, readConcern: <document>, max: <document>, min: <document>, returnKey: <bool>, showRecordId: <bool>, tailable: <bool>, oplogReplay: <bool>, noCursorTimeout: <bool>, awaitData: <bool>, allowPartialResults: <bool>, collation: <document>, allowDiskUse : <bool>, let: <document> // Added in MongoDB 5.0 } )
命令字段
该命令接受以下字段:
字段 | 类型 | 说明 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
| 字符串 | 要查询的集合或视图的名称。 | ||||||||||
| 文档 | 可选。查询谓词。如未指定,则集合中的所有文档都将与谓词匹配。 | ||||||||||
文档 | 可选。结果的排序规范。 | |||||||||||
| 文档 | |||||||||||
| 字符串或文档 | 可选。索引规范。以字符串形式指定索引名称或索引键模式。如果指定,查询系统将只考虑使用提示索引的计划。 除以下例外情况外,如果命令包含 | ||||||||||
| 正整数 | 可选。要跳过的文档数。默认值为 0。 | ||||||||||
| Non-negative integer | 可选。要返回的最大文档数。如果未指定,则默认为无限制。限制为 0 相当于不设限制。 | ||||||||||
| non-negative integer | 可选。第一批中要返回的文档数量。默认为 101。batchSize 为 0 是指将建立游标,但第一批不会返回任何文档。 与以前的传输协议版本不同,1 命令的 | ||||||||||
| 布尔 | 可选。确定是否在第一次批处理后关闭游标。默认值为 false。 | ||||||||||
| any | 可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。 在 | ||||||||||
| non-negative integer | 可选。 指定时间限制(以毫秒为单位)。如果您未指定 MongoDB 使用与 指定 | ||||||||||
| 文档 | 可选。指定读关注。
可能的读关注级别是:
有关读关注级别的更多信息,请参阅读关注级别。
| ||||||||||
| 文档 | 可选。特定索引的独占上限。请参阅 要使用 | ||||||||||
| 文档 | 可选。特定索引的包含下限。请参阅 要使用 | ||||||||||
| 布尔 | 可选。如果为 true,则仅返回结果文档中的索引键。默认值为 false。如果 returnKey 为 true 且 | ||||||||||
| 布尔 | 可选。确定是否返回每个文档的记录标识符。如果为 true,则将字段 $recordId 添加到返回文档。 | ||||||||||
| 布尔 | 可选。返回固定大小集合的可追加游标。 | ||||||||||
| 布尔 | |||||||||||
| 布尔 | |||||||||||
布尔 | ||||||||||||
| 文档 | 可选。 指定用于操作的排序规则。 排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。 排序规则选项的语法如下:
指定排序规则时, 如果未指定排序规则,但集合具有默认排序规则(请参阅 如果没有为收集或操作指定排序规则,MongoDB 将使用先前版本中使用的简单二进制比较来进行字符串比较。 您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果执行带排序的查找,则不能使用一种排序规则进行查找而另一种排序规则进行排序。 | ||||||||||
布尔 | 可选。 使用此选项可以覆盖特定查询的
从 MongoDB 6.0 开始,如果 有关详细信息,请参阅
有关 有关大型阻塞排序的内存限制的更多信息,请参阅排序和索引使用。 | |||||||||||
文档 |
输出
此命令返回一个包含游标信息的文档,包括游标 ID 和第一批文档。例如,当针对分片集合运行时,将返回以下文档:
{ "cursor" : { "firstBatch" : [ { "_id" : ObjectId("5e8e2ca217b5324fa9847435"), "zipcode" : "20001", "x" : 1 }, { "_id" : ObjectId("5e8e2ca517b5324fa9847436"), "zipcode" : "30001", "x" : 1 } ], "partialResultsReturned" : true, "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") } } }
字段 | 说明 |
---|---|
| 包含游标信息,包括游标 如果针对分分片的集合的操作由于查询的分片片不可用而返回部分结果,则 如果查询的分片最初可用于 |
| 表明命令是成功( |
除了上述特定于 find
的字段外,db.runCommand()
还包括副本集和分片集群的以下信息:
$clusterTime
operationTime
有关详细信息,请参阅 db.runCommand() 结果。
行为
$regex
查找查询不再忽略无效的 Regex
从 MongoDB 5.1 开始,不再忽略无效的 $regex options
选项。此更改使 $regex options
与 aggregate
命令和投影查询所使用的 $regex
更加一致。
会话
对于在一个会话内创建的游标,不能在该会话外调用 getMore
。
同样,对于在会话外创建的游标,不能在会话内调用 getMore
。
会话空闲超时
MongoDB 驱动程序和 mongosh
将所有操作与服务器会话相关联,未确认的写入操作除外。对于未与会话显式关联的操作(即使用 Mongo.startSession()
),MongoDB 驱动程序和 mongosh
会创建隐式会话并将其与该操作关联。
如果会话空闲时间超过 30 分钟,MongoDB Server 会将该会话标记为已过期,并可能随时将其关闭。当 MongoDB Server 关闭会话时,它还会终止任何正在进行的操作并打开与会话关联的游标。这包括使用超过 30 分钟的 noCursorTimeout()
或 maxTimeMS()
配置的游标。
对于返回游标的操作,如果游标的空闲时间可能超过 30 分钟,则使用 Mongo.startSession()
在显式会话中发出操作,并使用 refreshSessions
命令定期刷新会话。更多信息,请参阅会话空闲超时。
事务
重要
在大多数情况下,与单文档写入操作相比,分布式事务会产生更高的性能成本,并且分布式事务的可用性不应取代有效的模式设计。在许多情况下,非规范化数据模型(嵌入式文档和数组)仍然是数据和使用案例的最佳选择。换言之,对于许多场景,适当的数据建模将最大限度地减少对分布式事务的需求。
有关其他事务使用注意事项(如运行时间限制和 oplog 大小限制),另请参阅生产注意事项。
客户端断开连接
从 MongoDB 4.2 开始,如果在操作完成之前,发出 find
的客户端断开连接,MongoDB 将使用killOp
将 find
标记为终止。
Stable API
使用 Stable API V1 时,不支持以下 find
命令字段:
awaitData
max
min
noCursorTimeout
oplogReplay
returnKey
showRecordId
tailable
索引筛选器和排序规则
从 MongoDB 6.0 开始,索引筛选器会使用之前使用 planCacheSetFilter
命令设置的排序规则。
示例
指定排序和限制
以下命令运行 find
命令过滤 rating
字段和 cuisine
字段。该命令包含一个 projection
,仅返回匹配文档中的以下字段:_id
、name
、rating
和 address
字段。
此命令按 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
选项。
对副本集执行以下操作可以指定读关注 "majority"
,以读取确认已写入大多数节点的数据的最新副本。
db.runCommand( { find: "restaurants", filter: { rating: { $lt: 5 } }, readConcern: { level: "majority" } } )
无论读关注级别如何,节点上的最新数据可能无法反映系统中数据的最新版本。
getMore
命令使用原始 find
命令中指定的 readConcern
级别。
您可以使用 cursor.readConcern()
方法为 mongosh
方法 db.collection.find()
指定 readConcern
:
db.restaurants.find( { rating: { $lt: 5 } } ).readConcern("majority")
有关可用读关注的更多信息,请参阅读关注。
指定排序规则。
排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。
以下操作使用指定排序规则运行 find
命令:
db.runCommand( { find: "myColl", filter: { category: "cafe", status: "a" }, sort: { category: 1 }, collation: { locale: "fr", strength: 1 } } )
mongosh
提供了 cursor.collation()
来指定 db.collection.find()
操作的排序规则。
使用以下项中的变量: let
版本 5.0 中的新增功能。
要定义可在命令中其他位置访问的变量,请使用 let 选项。
注意
要使用变量筛选结果,您必须在 $expr
操作符中访问该变量。
创建集合 cakeFlavors
:
db.cakeFlavors.insertMany( [ { _id: 1, flavor: "chocolate" }, { _id: 2, flavor: "strawberry" }, { _id: 3, flavor: "cherry" } ] )
以下示例在 let
中定义了一个 targetFlavor
变量,并使用该变量检索巧克力蛋糕口味:
db.cakeFlavors.runCommand( { find: db.cakeFlavors.getName(), filter: { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } }, let : { targetFlavor: "chocolate" } } )