Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

数数

在此页面上

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

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

提示

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

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

注意

与 4.0 功能兼容的 MongoDB 驱动程序弃用了各自的游标和集合 count() API(运行 count 命令),改为使用与 countDocuments()estimatedDocumentCount() 相对应的新 API。有关特定驱动程序的具体 API 名称,请参阅驱动程序 API 文档。

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

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

重要

此命令在 M 0 、 M 2和 M 5集群中提供有限支持。有关更多信息,请参阅不支持的命令。

该命令具有以下语法:

注意

从版本 4.2 开始,MongoDB 对 count 命令的选项名称实施了更严格的验证。如果指定了未知的选项名称,则该命令将出错。

{
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
文档

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

readConcern: { level: <value> }

可能的读关注级别是:

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

maxTimeMS
non-negative integer
可选。 .. include:: /includes/maxTimeMS-description.rst
collation
文档

可选。

指定用于操作的排序规则

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

排序规则选项的语法如下:

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

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

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

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

您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果执行带排序的查找,则不能使用一种排序规则进行查找而另一种排序规则进行排序。

版本 3.4 中的新增功能

comment
any

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

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

从 MongoDB 5.0.9开始, count命令包含在Stable API V 1中。 要在 Stable API 中使用count命令,必须将驱动程序连接到运行 MongoDB 5.0的部署。 9或更高版本。

在事务中使用 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 秒出现一次。但是,如果 mongod 实例使用了非默认的 --syncdelay 设置,则检查点出现的次数可能会增多或减少。

mongod 的每个集合上运行 validate,以在非正常关闭之后恢复统计信息。

非正常关闭后:

注意

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

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

下文将举例说明 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') } }
} )

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

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

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

{ "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,命令状态 ok1

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

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

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

重要

  • 要使用 "majority"readConcern 级别,必须指定非空 query 条件。

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

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

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

后退

聚合