计数
定义
count
计算集合或视图中的文档数量。返回一个包含此计数以及命令状态的文档。
提示
注意
与4.0特性兼容的MongoDB驱动程序废弃了它们各自的游标和集合
count()
API(该API执行count
命令),转而使用与countDocuments()
和estimatedDocumentCount()
对应的新的API。有关特定驱动程序的API名称,请参阅驱动程序API文档。
兼容性
此命令在以下环境中提供的部署中可用
MongoDB Atlas:云中MongoDB部署的完全托管服务
重要
此命令在M0、M2和M5集群中支持有限。有关更多信息,请参阅不受支持的命令。
MongoDB Enterprise:基于订阅的自托管MongoDB版本
MongoDB Community:源代码可用的、免费使用且自托管的MongoDB版本
语法
该命令具有以下语法
注意
从版本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
具有以下字段
字段 | 类型 | 描述 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
计数 | 字符串 | 要计数的集合或视图的名称。 | ||||||||||
查询 | 文档 | 可选。选择要计数的集合或视图中的文档的查询。 | ||||||||||
limit | 整数 | 可选。返回的最大匹配文档数。 | ||||||||||
skip | 整数 | 可选。在返回结果之前跳过的匹配文档数。 | ||||||||||
hint | 字符串或文档 | 可选。使用的索引。指定索引名称作为字符串或索引规范文档。 | ||||||||||
readConcern | 文档 | 可选。指定读取关注。该选项的语法如下
可能的读取关注级别如下
有关读取关注级别的更多信息,请参阅读取关注级别。 | ||||||||||
maxTimeMS | 非负整数 | 可选。 指定以毫秒为单位的时间限制。如果您不指定 MongoDB 使用与 | ||||||||||
collation | 文档 | 可选。 指定用于操作的排序规则。 排序规则允许用户指定字符串比较的语言特定规则,例如字母大小写和重音符号的规则。 排序规则选项的语法如下
指定排序规则时, 如果未指定排序规则,但集合具有默认排序规则(请参阅 如果为集合或操作未指定排序规则,MongoDB将使用先前版本中用于字符串比较的简单二进制比较。 您不能为操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者在执行带有排序的查找时,您不能为查找和排序使用不同的排序规则。 | ||||||||||
注释 | 任何 | 可选。用户提供的用于附加到此命令的注释。设置后,此注释将出现在以下位置的此命令记录旁边
注释可以是任何有效的BSON类型(字符串、整数、对象、数组等)。 |
稳定API支持
从MongoDB 6.0开始,count
命令包含在稳定API V1中。要使用稳定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 } } ] )
意外关机后的准确性
使用Wired Tiger存储引擎对mongod
进行不干净关机后,计数count
命令报告的统计信息可能不准确。
漂移量取决于上次检查点和不干净关机之间的插入、更新或删除操作的数量。检查点通常每60秒发生一次。然而,使用非默认--syncdelay
设置的mongod
实例可能具有更频繁或更少的检查点。
在mongod
上的每个集合上运行validate
以在不干净关机后恢复统计信息。
在不干净关机后
注意
这种精度损失仅适用于不包含查询文档的count
操作。
客户端断开连接
从MongoDB 4.2版本开始,如果发出 count
命令的客户端在操作完成前断开连接,MongoDB将使用 killOp
命令标记 count
为终止。
示例
以下部分提供了 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"
读取关注级别,必须指定非空query
条件。无论读取关注级别如何,节点上的最新数据可能并不反映系统中的最新数据版本。
db.runCommand( { count: "restaurants", query: { rating: { $gte: 4 } }, readConcern: { level: "majority" } } )
为确保单个线程可以读取其自己的写入,请对副本集的主节点使用 "majority"
读取关注和 "majority"
写入关注。