对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

find(数据库命令)

find

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

提示

在 mongosh 中,此命令也可通过 db.collection.find() 或 db.collection.findOne() 辅助工具/辅助程序来运行。

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

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

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

重要

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

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

该命令接受以下字段:

字段
类型
说明

find

字符串

要查询的集合或视图的名称。

filter

文档

可选。查询谓词。如未指定,则集合中的所有文档都将与谓词匹配。

文档

可选。结果的排序规范。

projection

文档

可选。用于确定要在返回的文档中包含哪些字段的投影规范。

视图上的 find() 操作不支持以下 find 命令投影操作符:

hint

字符串或文档

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

除以下例外情况外,如果命令包含 min 和/或 max 字段,则必须使用 hint;如果 filter 是 _id 字段 { _id: <value> } 的相等条件,则在使用 min 和/或 max 时,hint 不是必需的。

skip

正整数

可选。要跳过的文档数。默认值为 0。

limit

Non-negative integer

可选。要返回的最大文档数。如果未指定,则默认为无限制。限制为 0 相当于不设限制。

batchSize

non-negative integer

可选。查询结果中每批次可返回的最大文档数量。默认情况下,find 命令的初始 batchSize 为 101 个文档或 16 个兆字节(MiB)中的较小值。后续批次的最大大小为 16 MiB。此选项可以强制执行比 16 MiB 更小的限制,但不能强制执行更大的限制。设置后,batchSize 是 batchSize 个文档或 16 MiB 文档中较小的一个。

batchSize 为 0 是指将建立游标,但第一批不会返回任何文档。

与之前的传输协议版本不同,1 命令的 findbatchSize 为 不会关闭游标。

singleBatch

布尔

可选。确定是否在第一次批处理后关闭游标。默认值为 false。

comment

any

可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:

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

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

maxTimeMS

non-negative integer

可选。

指定时间限制(以毫秒为单位)。如果您未指定 maxTimeMS 值,操作将不会超时。如果值为 0 ,则显式指定默认无限制行为。

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

指定 linearizable read concern 时,如果大多数数据承载节点不可用,则始终使用 maxTimeMS。maxTimeMS 确保操作不会无限期受阻,而且在无法满足读关注时返回错误。

readConcern

文档

可选。指定读关注。

readConcern 选项的语法如下:readConcern: { level: <value> }

可能的读关注级别是:

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

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

max

文档

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

要使用 max 字段,该命令还必须使用 hint ,除非指定的 filter 是 _id 字段 { _id: <value> }上的相等条件。

min

文档

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

要使用 min 字段,该命令还必须使用 hint ,除非指定的 filter 是 _id 字段 { _id: <value> }上的相等条件。

returnKey

布尔

可选。如果为 true,则仅返回结果文档中的索引键。默认值为 false。如果 returnKey 为 true 且find 命令不使用索引,则返回的文档将为空。

showRecordId

布尔

可选。确定是否返回每个文档的记录标识符。如果为 true,则将字段 $recordId 添加到返回文档。

tailable

布尔

可选。返回固定大小集合的可追加游标。

awaitData

布尔

可选。与 tailablegetMore 选项结合使用,可在数据末尾暂时区块游标上的 命令,而不是不返回数据。超时一段时间后,find 将正常返回。

noCursorTimeout

布尔

可选。阻止服务器在一段不活动时间(30 分钟)后将非会话空闲游标设置为超时。对于属于会话的游标,处理会被忽略。有关更多信息,请参阅会话空闲超时。

布尔

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

如果find (或后续的getMore 命令)由于查询的分片不可用而返回部分结果,则 find 输出将包含partialResultsReturned 指示符字段。如果查询的分片可用于初始find 命令,但一个或多个分片不可用于后续的 命令,则只有在分片不可用时运行的getMore getMorepartialResultsReturned命令才会在其输出中包含 。

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 MB 的内存用于管道执行阶段,那么 MongoDB 会自动将临时文件写入磁盘,除非查询指定了 { allowDiskUse: false }。

有关详细信息,请参阅allowDiskUseByDefault。

allowDiskUse 如果MongoDB可以使用索引满足指定的排序,或者内存中排序需要的内存少于 MB,则 MongoDB100 不会产生任何影响。

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

如需进一步了解大型内存排序的内存限制,请参阅排序和索引使用。

文档

可选。

指定包含变量列表的文档。这样可以将变量与查询文本分开,从而提高命令的可读性。

文档语法为:

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

变量设置为表达式返回的值,并且之后不能再进行更改。

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

要使用变量筛选结果,您必须在 $expr 操作符中访问该变量。

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

版本 5.0 中的新增功能。

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

{
"cursor" : {
"firstBatch" : [
{
"_id" : ObjectId("5e8e2ca217b5324fa9847435"),
"zipcode" : "20001",
"x" : 1
},
{
"_id" : ObjectId("5e8e2ca517b5324fa9847436"),
"zipcode" : "30001",
"x" : 1
}
],
"partialResultsReturned" : true,
"id" : Long("668860441858272439"),
"ns" : "test.contacts"
},
"ok" : 1,
"operationTime" : Timestamp(1586380205, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1586380225, 2),
"signature" : {
"hash" : BinData(0,"aI/jWsUVUSkMw8id+A+AVVTQh9Y="),
"keyId" : Long("6813364731999420435")
}
}
}
字段
说明

cursor

包含游标信息,包括游标 id 以及文档的 firstBatch。

如果针对分片的集合的操作由于查询的分片不可用而返回部分结果,则cursor 文档包含partialResultsReturned 字段。由于所查询的分片不可用,要返回部分结果而不是错误,运行find 命令时必须将 allowPartialResults设立为 true。请参阅 allowPartialResults。

如果查询的分片最初可用于find 命令,但一个或多个分片在后续的getMore 命令中变得不可用,则只有当查询的一个或多个分片片不可用时运行的getMore partialResultsReturned命令才会在输出。

"ok"

表明命令是成功(1)还是失败(0)。

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

  • $clusterTime

  • operationTime

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

如果不需要原始命令响应,请使用 db.collection.find() 或 db.collection.findOne() 辅助程序。

以下部分介绍了 find() 命令的行为注意事项。

MongoDB通常按以下操作顺序生成 find() 操作的输出:

  • 匹配

  • sort

  • 跳过

  • limit

  • 项目

MongoDB可能会以不同的顺序执行组件,以优化查询性能,同时仍保持上述操作顺序。

从 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 命令定期刷新会话。更多信息,请参阅会话空闲超时。

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

  • 对于在 ACID 事务外部创建的游标,无法在 ACID 事务内部调用 getMore。

  • 对于在事务中创建的游标,无法在事务外部调用 getMore。

重要

在大多数情况下,与单文档写入操作相比,分布式事务会产生更高的性能成本,并且分布式事务的可用性不应取代有效的模式设计。在许多情况下,非规范化数据模型(嵌入式文档和数组)仍然是数据和使用案例的最佳选择。换言之,对于许多场景,适当的数据建模将最大限度地减少对分布式事务的需求。

有关其他事务使用注意事项(如运行时间限制和 oplog 大小限制),另请参阅生产注意事项。

如果发出find 的客户端在操作完成之前断开连接,则MongoDB使用find killOp将 标记为终止。

使用 Stable API V1 时,不支持以下find 命令字段:

  • awaitData

  • max

  • min

  • noCursorTimeout

  • oplogReplay

  • returnKey

  • showRecordId

  • tailable

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

本页上的示例使用sample_mflix示例数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载示例数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。

以下命令使用 movies集合上的 find 来查找 IMDB 评级为 9 或更高且属于连续剧类型的电影。该命令包含 projection,以便仅返回匹配文档中的 title、imdb.rating 和 year 字段。

此命令按 title 字段对结果集中的文档进行排序,并将结果集限制为 5 个文档。

db.runCommand(
{
find: "movies",
filter: { "imdb.rating": { $gte: 9 }, genres: "Drama" },
projection: { title: 1, "imdb.rating": 1, year: 1 },
sort: { title: 1 },
limit: 5
}
)

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

此代码示例对副本集上的 movies集合执行以下操作:

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

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

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

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

db.movies.find( { "imdb.rating": { $lt: 2 } } ).readConcern("majority")

有关可用读关注的更多信息,请参阅读关注。

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

此示例执行以下操作:

  • 查找标题为 Les Misérables 且日期为 2012 的电影

  • 对匹配文档进行排序 title

  • 使用法语排序规则 (locale: "fr") 和不区分重音的匹配 (strength: 1) 运行 find:

db.runCommand(
{
find: "movies",
filter: { title: "les misérables", year: 2012 },
sort: { title: 1 },
collation: { locale: "fr", strength: 1 }
}
)

mongosh提供cursor.collation() ,用于指定db.collection.find() 操作的排序规则。

以下示例定义了一个 targetTitle 变量,并通过将 title字段与变量值进行比较来使用它来查找电影。此示例查找所有标题为“教父”的电影:

db.movies.runCommand( {
find: db.movies.getName(),
filter: { $expr: { $eq: [ "$title", "$$targetTitle" ] } },
let : { targetTitle: "The Godfather" }
} )
给本页内容打分