文档菜单
文档首页
/
MongoDB 手册
/ / /

查找

本页

  • 定义
  • 兼容性
  • 语法
  • 行为
  • 示例
find

执行查询并返回第一批结果和游标ID,客户端可以据此构建游标。

提示

mongosh中,此命令也可以通过db.collection.find()db.collection.findOne()辅助方法运行.

辅助方法对于mongosh用户来说很方便,但它们可能不会返回与数据库命令相同级别的信息。在不需要便利性或需要额外的返回字段的情况下,请使用数据库命令。

此命令在以下环境中托管的部署中可用

  • MongoDB Atlas:云中MongoDB部署的完全托管服务

重要

此命令在M0、M2和M5集群中支持有限。有关更多信息,请参阅不受支持的命令。

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

可选。确定返回文档中包含哪些字段的投影规范。请参阅投影投影运算符。

视图上的find()操作不支持以下查询和投影运算符运算符

hint
string or document

可选。索引规范。指定索引名称作为字符串或索引键模式。如果指定,则查询系统将只考虑使用提示索引的计划。

有以下例外,如果命令包括min和/或max字段,则需要hint;如果filter是关于_id字段的等价条件{ _id: <value> },则不需要hint

skip
正整数
可选。要跳过的文档数。默认为0。
limit
非负整数
可选。要返回的文档的最大数量。如果未指定,则默认无限制。限制为0相当于设置无限制。
batchSize
非负整数

可选。第一次批处理中返回的文档数。默认为101。batchSize为0表示将建立光标,但第一次批处理中不会返回任何文档。

与之前的网络协议版本不同,find命令中batchSize为1不会关闭光标。

单批次

布尔型
可选。确定在第一个批次之后是否关闭游标。默认为false。
注释
任何类型

可选。用户提供的用于附加到此命令的注释。一旦设置,此注释将出现在以下位置的此命令记录旁边

注释可以是任何有效的BSON类型(字符串、整数、对象、数组等)。

设置在find命令上的任何注释都将继承在find游标上运行的任何后续getMore命令。

maxTimeMS
非负整数

可选。

指定毫秒数的时间限制。如果您未指定maxTimeMS的值,则操作不会超时。显式指定0将指定默认的无界行为。

MongoDB使用与db.killOp()相同的机制终止超过其分配时间限制的操作。MongoDB仅在操作的一个指定的中断点处终止操作。

指定线性一致性读取关注时,始终使用maxTimeMS,以防大部分数据承载成员不可用。maxTimeMS确保操作不会无限期阻塞,并且如果读取关注无法满足,则返回错误。

readConcern
document

可选。指定读取关注

readConcern选项具有以下语法:readConcern: { level: <value> }

可能的读取关注级别如下

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

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

max
document

可选。特定索引的独占上限。有关详细信息,请参阅 cursor.max()

要使用 max 字段,命令还必须使用 hint,除非指定的 filter_id 字段的等值条件 { _id: <value> }

min
document

可选。特定索引的包含下限。有关详细信息,请参阅 cursor.min()

要使用 min 字段,命令还必须使用 hint,除非指定的 filter_id 字段的等值条件 { _id: <value> }

returnKey
布尔型
可选。如果为真,则只返回结果文档中的索引键。默认值为 false。如果 returnKey 为真,并且 find 命令未使用索引,则返回的文档将为空。
showRecordId
布尔型
可选。确定是否返回每个文档的记录标识符。如果为真,则在返回的文档中添加一个字段 $recordId。
tailable
布尔型
可选。为 capped 集合返回一个 tailable cursor
awaitData
布尔型
可选。与 tailable 选项一起使用,将 getMore 命令在数据的末尾暂时阻塞,而不是返回无数据。在超时期间,find 返回正常。
noCursorTimeout
布尔型
可选。防止服务器在 30 分钟的不活动期间超时非会话空闲游标。对于会话中的游标,忽略此选项。有关更多信息,请参阅 会话空闲超时。
布尔型

可选。对于针对分片集合的查询,如果查询的一个或多个分片不可用,则允许命令(或后续的 getMore 命令)返回部分结果,而不是错误。

如果因为查询的分片不可用,find(或后续的 getMore 命令)返回部分结果,则 find 输出 包含一个 partialResultsReturned 指示字段。如果查询的分片对初始 find 命令可用,但一个或多个分片在后续的 getMore 命令中不可用,则只有当分片不可用时的 getMore 命令的输出中包含 partialResultsReturned

collation
document

可选。

指定操作要使用的 排序规则

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

排序选项具有以下语法

collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}

指定排序时,locale字段是必需的;所有其他排序字段都是可选的。有关字段的描述,请参阅排序文档。

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

如果未为集合或操作指定排序,MongoDB将使用在先前版本中用于字符串比较的简单二进制比较。

您不能为一个操作指定多个排序。例如,您不能按字段指定不同的排序,或者在执行带有排序的查找时,您不能为查找和排序使用不同的排序。

布尔型

可选。

使用此选项可以覆盖特定查询的allowDiskUseByDefault。您可以使用此选项来

  • 在默认允许磁盘使用的系统上禁止磁盘使用。

  • 在默认禁止磁盘使用的系统上允许磁盘使用。

从MongoDB 6.0开始,如果allowDiskUseByDefault设置为true且服务器对管道执行阶段需要超过100兆字节的内存,MongoDB将自动将临时文件写入磁盘,除非查询指定{ allowDiskUse: false }

有关详细信息,请参阅allowDiskUseByDefault

allowDiskUse如果MongoDB可以使用索引满足指定的排序,或者如果阻止排序需要小于100兆字节的内存,则没有效果。

有关allowDiskUse的更完整文档,请参阅cursor.allowDiskUse()

有关大型阻止排序的内存限制的更多信息,请参阅排序和索引使用。

document

可选。

指定一个包含变量列表的文档。这允许您通过将变量从查询文本中分离出来来提高命令的可读性。

文档语法是

{
<variable_name_1>: <expression_1>,
...,
<variable_name_n>: <expression_n>
}

变量设置为表达式返回的值,之后无法更改。

要在命令中访问变量的值,请使用双美元符号前缀($$)与变量名一起,形式为$$<variable_name>。例如:$$targetTotal

要使用变量过滤结果,必须在$expr运算符中访问变量。

有关使用let和变量的完整示例,请参阅let中使用变量。

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")
}
}
}
字段
描述
光标

包含光标信息,包括光标 id 和文档的第一批 firstBatch

如果由于查询的分片(集)不可用而返回部分结果,则 cursor 文档包含一个 partialResultsReturned 字段。要返回部分结果,而不是错误,由于查询的分片(集)不可用,必须将 find 命令的 allowPartialResults 设置为 true。请参阅 allowPartialResults。

如果最初可用,但后续的 getMore 命令中有一个或多个分片不可用,则只有当查询的分片或分片不可用时,在输出中包含 partialResultsReturned 标志的 getMore 命令运行。

"ok"
指示命令是否成功(1)或失败(0)。

除了上述特定的 find 字段外,db.runCommand() 还包括副本集和分片集群的以下信息

  • $clusterTime

  • operationTime

有关详细信息,请参阅db.runCommand() 结果

从 MongoDB 5.1 版本开始,无效的 $regex 选项 选项不再被忽略。此更改使 $regex 选项 的使用与 aggregate 命令和 投影 查询更加一致。

对于在会话中创建的游标,您无法在会话外调用 getMore

同样,对于在会话外创建的游标,您无法在会话内调用 getMore

MongoDB 驱动和 mongosh 将所有操作都与服务器会话相关联,除非是未确认的写操作。对于没有显式与会话相关联的操作(即使用 Mongo.startSession()),MongoDB 驱动和 mongosh 会创建一个隐式会话并将其与操作相关联。

如果会话空闲时间超过30分钟,MongoDB服务器将该会话标记为过期,并可能随时关闭它。当MongoDB服务器关闭会话时,它也会终止与该会话相关联的任何正在进行的操作和打开的光标。这包括配置了 noCursorTimeout()maxTimeMS() 大于30分钟的光标。

对于返回光标的操作,如果光标可能空闲时间超过30分钟,请使用 Mongo.startSession() 在显式会话中执行操作,并定期使用 refreshSessions 命令刷新会话。有关更多信息,请参阅 会话空闲超时

find可以在分布式事务中使用。

  • 对于在事务外部创建的光标,您不能在事务中调用getMore

  • 对于在事务中创建的光标,您不能在事务外部调用getMore

重要

在大多数情况下,分布式事务相比单文档写入会带来更高的性能成本,分布式事务的可用性不应替代有效的模式设计。对于许多场景,去规范化数据模型(嵌入式文档和数组)将仍然是最优选择。也就是说,对于许多场景,适当地建模您的数据将最大限度地减少分布式事务的需求。

有关事务的更多使用注意事项(例如运行时限制和oplog大小限制),请参阅生产注意事项。

从MongoDB 4.2版本开始,如果发出find的客户端在操作完成之前断开连接,MongoDB将使用killOpfind标记为终止。

当使用稳定API V1时,以下find命令字段不受支持

  • awaitData

  • max

  • min

  • noCursorTimeout

  • oplogReplay

  • returnKey

  • showRecordId

  • tailable

从MongoDB 6.0开始,索引过滤器使用之前通过planCacheSetFilter命令设置的排序规则。

从MongoDB 8.0开始,使用查询设置而不是添加索引过滤器。从MongoDB 8.0开始,索引过滤器已被弃用。

查询设置比索引过滤器具有更多功能。此外,索引过滤器不持久,并且无法轻松为所有集群节点创建索引过滤器。要添加查询设置并查看示例,请参阅setQuerySettings

从MongoDB 7.3版本开始,当你在具有singleBatch: truebatchSize: 1选项的视图中使用find命令时,将不再返回游标。在MongoDB的先前版本中,即使将single batch选项设置为true,这些find查询也会返回游标。

New中更改8.0.

您可以使用查询设置来设置索引提示、设置操作拒绝过滤器和其他字段。这些设置应用于整个集群上的查询形状。集群在关闭后仍保留这些设置。

查询优化器在查询计划期间使用查询设置作为额外的输入,这会影响所选的查询计划。您还可以使用查询设置来阻止查询形状。

要添加查询设置和探索示例,请参阅setQuerySettings

您可以为finddistinctaggregate命令添加查询设置。

查询设置具有更多功能,并且比已弃用的索引过滤器更受欢迎。

要删除查询设置,请使用removeQuerySettings。要获取查询设置,请在聚合管道中使用$querySettings阶段。

以下命令在 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 选项。

以下对副本集的操作指定了读取关注点"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 }
}
)

mongosh提供cursor.collation()来指定排序规则

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" }
} )

返回

删除