查找
定义
find
执行查询并返回第一批结果和游标ID,客户端可以据此构建游标。
提示
在
mongosh
中,此命令也可以通过db.collection.find()
或db.collection.findOne()
辅助方法运行.辅助方法对于
mongosh
用户来说很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要便利性或需要额外的返回字段的情况下,请使用数据库命令。
兼容性
此命令在以下环境中托管的部署中可用
MongoDB Atlas:云中MongoDB部署的完全托管服务
重要
此命令在M0、M2和M5集群中支持有限。有关更多信息,请参阅不受支持的命令。
MongoDB企业版:基于订阅、自行管理的MongoDB版本
MongoDB社区版:源代码可用的、免费使用且可自行管理的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 } )
命令字段
命令接受以下字段
字段 | 类型 | 描述 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
查找 | string | 查询的集合或视图的名称。 | ||||||||||
filter | document | 可选。查询谓词。如果未指定,则所有集合中的文档都将匹配谓词。 | ||||||||||
document | 可选。结果排序的排序规范。 | |||||||||||
projection | document | |||||||||||
hint | string or document | 可选。索引规范。指定索引名称作为字符串或索引键模式。如果指定,则查询系统将只考虑使用提示索引的计划。 有以下例外,如果命令包括 | ||||||||||
skip | 正整数 | 可选。要跳过的文档数。默认为0。 | ||||||||||
limit | 非负整数 | 可选。要返回的文档的最大数量。如果未指定,则默认无限制。限制为0相当于设置无限制。 | ||||||||||
batchSize | 非负整数 | 可选。第一次批处理中返回的文档数。默认为101。batchSize为0表示将建立光标,但第一次批处理中不会返回任何文档。 与之前的网络协议版本不同, | ||||||||||
| 布尔型 | 可选。确定在第一个批次之后是否关闭游标。默认为false。 | ||||||||||
注释 | 任何类型 | 可选。用户提供的用于附加到此命令的注释。一旦设置,此注释将出现在以下位置的此命令记录旁边
注释可以是任何有效的BSON类型(字符串、整数、对象、数组等)。 设置在 | ||||||||||
maxTimeMS | 非负整数 | |||||||||||
readConcern | document | 可选。指定读取关注。
可能的读取关注级别如下
有关读取关注级别的更多信息,请参阅读取关注级别。
| ||||||||||
max | document | 可选。特定索引的独占上限。有关详细信息,请参阅 要使用 | ||||||||||
min | document | 可选。特定索引的包含下限。有关详细信息,请参阅 要使用 | ||||||||||
returnKey | 布尔型 | 可选。如果为真,则只返回结果文档中的索引键。默认值为 false。如果 returnKey 为真,并且 find 命令未使用索引,则返回的文档将为空。 | ||||||||||
showRecordId | 布尔型 | 可选。确定是否返回每个文档的记录标识符。如果为真,则在返回的文档中添加一个字段 $recordId。 | ||||||||||
tailable | 布尔型 | 可选。为 capped 集合返回一个 tailable cursor。 | ||||||||||
awaitData | 布尔型 | |||||||||||
noCursorTimeout | 布尔型 | 可选。防止服务器在 30 分钟的不活动期间超时非会话空闲游标。对于会话中的游标,忽略此选项。有关更多信息,请参阅 会话空闲超时。 | ||||||||||
布尔型 | ||||||||||||
collation | document | 可选。 指定操作要使用的 排序规则。 排序(Collation)允许用户指定字符串比较的语言特定规则,例如字母大小写和重音符号的规则。 排序选项具有以下语法
指定排序时, 如果未指定排序,但集合具有默认排序(见 如果未为集合或操作指定排序,MongoDB将使用在先前版本中用于字符串比较的简单二进制比较。 您不能为一个操作指定多个排序。例如,您不能按字段指定不同的排序,或者在执行带有排序的查找时,您不能为查找和排序使用不同的排序。 | ||||||||||
布尔型 | 可选。 使用此选项可以覆盖特定查询的
从MongoDB 6.0开始,如果 有关详细信息,请参阅
有关 有关大型阻止排序的内存限制的更多信息,请参阅排序和索引使用。 | |||||||||||
document | 可选。 指定一个包含变量列表的文档。这允许您通过将变量从查询文本中分离出来来提高命令的可读性。 文档语法是
变量设置为表达式返回的值,之后无法更改。 要在命令中访问变量的值,请使用双美元符号前缀( 要使用变量过滤结果,必须在 有关使用 New中更改5.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") } } }
字段 | 描述 |
---|---|
光标 | 包含光标信息,包括光标 如果由于查询的分片(集)不可用而返回部分结果,则 如果最初可用,但后续的 |
"ok" | 指示命令是否成功( 1 )或失败(0 )。 |
除了上述特定的 find
字段外,db.runCommand()
还包括副本集和分片集群的以下信息
$clusterTime
operationTime
有关详细信息,请参阅db.runCommand() 结果。
行为
$regex
查询不再忽略无效的正则表达式
从 MongoDB 5.1 版本开始,无效的 $regex 选项
选项不再被忽略。此更改使 $regex 选项
的使用与 aggregate
命令和 投影 查询更加一致。
会话
对于在会话中创建的游标,您无法在会话外调用 getMore
。
同样,对于在会话外创建的游标,您无法在会话内调用 getMore
。
会话空闲超时
MongoDB 驱动和 mongosh
将所有操作都与服务器会话相关联,除非是未确认的写操作。对于没有显式与会话相关联的操作(即使用 Mongo.startSession()
),MongoDB 驱动和 mongosh
会创建一个隐式会话并将其与操作相关联。
如果会话空闲时间超过30分钟,MongoDB服务器将该会话标记为过期,并可能随时关闭它。当MongoDB服务器关闭会话时,它也会终止与该会话相关联的任何正在进行的操作和打开的光标。这包括配置了 noCursorTimeout()
或 maxTimeMS()
大于30分钟的光标。
对于返回光标的操作,如果光标可能空闲时间超过30分钟,请使用 Mongo.startSession()
在显式会话中执行操作,并定期使用 refreshSessions
命令刷新会话。有关更多信息,请参阅 会话空闲超时。
交易
重要
在大多数情况下,分布式事务相比单文档写入会带来更高的性能成本,分布式事务的可用性不应替代有效的模式设计。对于许多场景,去规范化数据模型(嵌入式文档和数组)将仍然是最优选择。也就是说,对于许多场景,适当地建模您的数据将最大限度地减少分布式事务的需求。
有关事务的更多使用注意事项(例如运行时限制和oplog大小限制),请参阅生产注意事项。
客户端断开连接
从MongoDB 4.2版本开始,如果发出find
的客户端在操作完成之前断开连接,MongoDB将使用killOp
将find
标记为终止。
稳定的API
awaitData
max
min
noCursorTimeout
oplogReplay
returnKey
showRecordId
tailable
索引过滤器与排序规则
从MongoDB 6.0开始,索引过滤器使用之前通过planCacheSetFilter
命令设置的排序规则。
从MongoDB 8.0开始,使用查询设置而不是添加索引过滤器。从MongoDB 8.0开始,索引过滤器已被弃用。
查询设置比索引过滤器具有更多功能。此外,索引过滤器不持久,并且无法轻松为所有集群节点创建索引过滤器。要添加查询设置并查看示例,请参阅setQuerySettings
。
在视图上的Find游标行为
从MongoDB 7.3版本开始,当你在具有singleBatch: true
和batchSize: 1
选项的视图中使用find命令时,将不再返回游标。在MongoDB的先前版本中,即使将single batch选项设置为true
,这些find查询也会返回游标。
查询设置
New中更改8.0.
您可以使用查询设置来设置索引提示、设置操作拒绝过滤器和其他字段。这些设置应用于整个集群上的查询形状。集群在关闭后仍保留这些设置。
查询优化器在查询计划期间使用查询设置作为额外的输入,这会影响所选的查询计划。您还可以使用查询设置来阻止查询形状。
要添加查询设置和探索示例,请参阅setQuerySettings
。
您可以为find
、distinct
和aggregate
命令添加查询设置。
查询设置具有更多功能,并且比已弃用的索引过滤器更受欢迎。
要删除查询设置,请使用removeQuerySettings
。要获取查询设置,请在聚合管道中使用$querySettings
阶段。
示例
指定排序和限制
以下命令在 rating
字段和 cuisine
字段上运行 find
命令进行过滤。该命令包含一个 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()
指定读取关注点。
db.restaurants.find( { rating: { $lt: 5 } } ).readConcern("majority")
有关可用读取关注点的更多信息,请参阅读取关注点。
指定排序规则
排序(Collation)允许用户指定字符串比较的语言特定规则,例如字母大小写和重音符号的规则。
以下操作使用指定的排序规则执行find
命令。
db.runCommand( { find: "myColl", filter: { category: "cafe", status: "a" }, sort: { category: 1 }, collation: { locale: "fr", strength: 1 } } )
在let
中使用变量
New中更改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" } } )