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

计数

本页内容

  • 定义
  • 兼容性
  • 语法
  • 稳定 API 支持
  • 行为
  • 示例
count

计算集合或视图中的文档数量。返回一个包含此计数以及命令状态的文档。

提示

mongosh,此命令也可以通过count() 辅助方法运行.

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

注意

与4.0特性兼容的MongoDB驱动程序废弃了它们各自的游标和集合count() API(该API执行count命令),转而使用与countDocuments()estimatedDocumentCount()对应的新的API。有关特定驱动程序的API名称,请参阅驱动程序API文档。

此命令在以下环境中提供的部署中可用

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

重要

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

该命令具有以下语法

注意

从版本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
文档

可选。指定读取关注。该选项的语法如下

readConcern: { level: <value> }

可能的读取关注级别如下

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

maxTimeMS
非负整数

可选。

指定以毫秒为单位的时间限制。如果您不指定 maxTimeMS 的值,则操作不会超时。值 0 明确指定了默认的无界行为。

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

collation
文档

可选。

指定用于操作的排序规则。

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

排序规则选项的语法如下

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

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

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

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

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

注释
任何

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

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

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

提示

另请参阅

$collStats 以根据集合的元数据返回一个近似计数。

使用Wired Tiger存储引擎对mongod进行不干净关机后,计数count命令报告的统计信息可能不准确。

漂移量取决于上次检查点和不干净关机之间的插入、更新或删除操作的数量。检查点通常每60秒发生一次。然而,使用非默认--syncdelay设置的mongod实例可能具有更频繁或更少的检查点。

mongod上的每个集合上运行validate以在不干净关机后恢复统计信息。

在不干净关机后

注意

这种精度损失仅适用于不包含查询文档的count操作。

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

以下部分提供了 count 命令的示例。

以下操作计算 orders 集合中所有文档的数量

db.runCommand( { count: 'orders' } )

在结果中,代表计数的 n26,命令状态 ok1

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

在结果中,表示计数的 n1,命令状态 ok 也是 1

{ "n" : 1, "ok" : 1 }

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

以下对副本集的操作指定了 "majority" 读取关注,以读取已确认写入到大多数节点的最新数据副本。

重要

  • 要使用 "majority" 读取关注级别,必须指定非空 query 条件。

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

db.runCommand(
{
count: "restaurants",
query: { rating: { $gte: 4 } },
readConcern: { level: "majority" }
}
)

为确保单个线程可以读取其自己的写入,请对副本集的主节点使用 "majority" 读取关注和 "majority" 写入关注。

返回

聚合