数数
在此页面上
定义
-
count
-
计算集合或视图中的文档数量。返回包含此计数以及命令状态的文档。
提示
注意
与4兼容的 MongoDB 驱动程序。 0功能弃用了各自的游标和集合
count()
API(运行count
命令),转而使用与countDocuments()
和estimatedDocumentCount()
相对应的新 API。有关给定驱动程序的具体 API 名称,请参阅驱动程序 API 文档。
语法
该命令具有以下语法:
注意
从版本4开始。 2 ,MongoDB 对
count
命令的选项名称实施更严格的验证。如果指定未知的选项名称,该命令现在会出错。
db.runCommand( { count: <collection or view>, query: <document>, limit: <integer>, skip: <integer>, hint: <hint>, readConcern: <document>, maxTimeMS: <integer>, collation: <document>, comment: <any> } )
命令字段
count
有以下字段:
字段
|
类型
|
说明
|
||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
count
|
字符串
|
要对其进行计数的集合或视图的名称。
|
||||||||||
query
|
文档
|
可选。查询,选择哪些文档要在集合或视图中计数。
|
||||||||||
limit
|
整型
|
可选。要返回的匹配文档的最大数量。
|
||||||||||
skip
|
整型
|
可选。 在返回结果前跳过的匹配文档数。
|
||||||||||
hint
|
字符串或文档
|
可选。要使用的索引。指定字符串形式的索引名称或索引规范文档。
|
||||||||||
readConcern
|
文档
|
可选。指定 读关注 。该选项的语法如下:
可能的读关注级别是:
有关读关注级别的更多信息,请参阅 读关注级别 。 |
||||||||||
maxTimeMS
|
非负整数
|
可选。
指定时间限制(以毫秒为单位)。如果您未指定
MongoDB 使用与
|
||||||||||
collation
|
文档
|
可选。 指定用于操作的 排序规则 。 排序规则 允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。 排序规则选项的语法如下:
指定排序规则时,
如果未指定排序规则,但集合具有默认排序规则(请参阅
如果没有为收集或操作指定排序规则,MongoDB 将使用先前版本中使用的简单二进制比较来进行字符串比较。 您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果执行带排序的查找,则不能使用一种排序规则进行查找而另一种排序规则进行排序。 |
||||||||||
comment
|
注意到
|
可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
注释可以是任何有效的 BSON 类型 (字符串、整型、对象、数组等)。 |
稳定的 API 支持
从 MongoDB 6.0 开始,
count
命令包含在
Stable API
V1 中。要在 Stable API 中使用
count
命令,必须将驱动程序连接到运行 MongoDB 6.0 或更高版本的部署。
行为
没有查询谓词的不准确计数
在不使用查询谓词的情况下调用
count
时,您收到的文档计数可能不准确。如果没有查询谓词,
count
命令将根据集合的元数据返回结果,这可能会得出近似计数。特别是,
-
在分片集群上,所产生的计数将无法正确剔除 孤立文档 。
-
在非正常关闭或 基于文件副本的初始同步 后,计数可能不正确。
对于基于集合元数据的计数,另请参阅 带有计数选项的 CollStats 管道阶段 。
计数和事务
当您在事务中使用
count
时,生成的计数不会过滤掉任何未提交
的多文档事务。
有关详情,请参阅 事务和计数操作 。
准确性与分片集群
在分片集群上,如果存在
孤立文档
或正在进行数据
count
段迁移
,则在不使用查询谓词的情况下运行 命令可能会导致计数
不准确
。
为避免这些情况,请在分片集群上使用
db.collection.aggregate()
方法:
您可以使用
$count
阶段来对文档进行计数。例如,以下操作会对集合中的文档进行计数:
db.collection.aggregate( [ { $count: "myCount" } ])
$count
阶段相当于以下
$group
+
$project
序列:
db.collection.aggregate( [ { $group: { _id: null, count: { $sum: 1 } } }, { $project: { _id: 0 } } ] )
提示
另请参阅:
$collStats
根据集合的元数据返回近似计数。
意外关闭后的准确性
mongod
使用
Wired Tiger
存储引擎的 非正常关闭后,
count
报告的计数统计信息可能不准确。
偏差的大小取决于在最后一个
检查点
和非正常关闭之间执行的插入、更新或删除操作的次数。检查点通常每 60 秒出现一次。但是,如果
mongod
实例使用了非默认的
--syncdelay
设置,则检查点出现的次数可能会增多或减少。
在
mongod
的每个集合上运行
validate
,以在非正常关闭之后恢复统计信息。
非正常关闭后:
注意
这种准确性损失仅适用于
count
不
包含查询文档的 操作。
客户端断开连接
从 MongoDB4 开始。2 ,如果发出 的客户端在操作完成之前断开连接,MongoDB
count
会使用
count
killOp
将 标记为终止。
举例
以下部分提供了
count
命令的示例。
对所有文档进行计数
以下操作计算
orders
集合中所有文档的数量:
db.runCommand( { count: 'orders' } )
结果中,代表计数的
n
为
26
,命令状态
ok
为
1
:
{ "n" : 26, "ok" : 1 }
对与查询匹配的文档进行计数
以下操作将返回
orders
集合中
ord_dt
字段的值大于
Date('01/01/2012')
的文档的计数:
db.runCommand( { count:'orders', query: { ord_dt: { $gt: new Date('01/01/2012') } } } )
结果中,代表计数的
n
为
13
,命令状态
ok
为
1
:
{ "n" : 13, "ok" : 1 }
跳过指定数量的文档
以下操作返回
orders
集合中
ord_dt
字段的值大于
Date('01/01/2012')
的文档计数,并跳过前
10
个匹配的文档:
db.runCommand( { count:'orders', query: { ord_dt: { $gt: new Date('01/01/2012') } }, skip: 10 } )
结果中,代表计数的
n
为
3
,命令状态
ok
为
1
:
{ "n" : 3, "ok" : 1 }
指定要使用的索引
以下操作使用索引
{ status: 1 }
来返回
orders
集合中文档的计数,其中
ord_dt
字段的值大于
Date('01/01/2012')
且
status
字段的值等于
"D"
:
db.runCommand( { count:'orders', query: { ord_dt: { $gt: new Date('01/01/2012') }, status: "D" }, hint: { status: 1 } } )
结果中,代表计数的
n
为
1
,命令状态
ok
为
1
:
{ "n" : 1, "ok" : 1 }
覆盖默认读关注
若要覆盖
"local"
的默认读取关注级别,请使用
readConcern
选项。
对副本集执行以下操作可以指定
读关注
"majority"
,以读取确认已写入大多数节点的数据的最新副本。
重要
-
要使用
"majority"
的readConcern
级别,必须指定非空query
条件。 -
无论 读关注 级别如何,节点上的最新数据可能无法反映系统中数据的最新版本。
db.runCommand( { count: "restaurants", query: { rating: { $gte: 4 } }, readConcern: { level: "majority" } } )
为确保单个线程可以读取自己的写入内容,请对副本集的主节点使用
"majority"
读关注和
"majority"
写关注。