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

db.collection.count()

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 行为
  • 示例
db.collection.count(query, options)

重要

mongosh 方法

本页面提供 mongosh 方法的相关信息。这不是数据库命令或特定语言驱动程序(例如 Node.js)的相关文档。

有关数据库命令,请参阅 count 命令。

如需了解 MongoDB API 驱动程序,请参阅特定语言的 MongoDB 驱动程序文档。

注意

与 4.0 功能兼容的 MongoDB 驱动程序不建议使用各自的游标和集合 count() API,转而使用针对 countDocuments()estimatedDocumentCount() 的新 API。有关给定驱动程序的具体 API 名称,请参阅驱动程序文档。

返回与集合或视图的 find() 查询相匹配的文档数。db.collection.count() 方法不执行 find() 操作,而是计算并返回与查询匹配的结果数。

此方法可用于以下环境中托管的部署:

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

重要

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

该方法采用以下参数:

Parameter
类型
说明
query
文档
查询选择条件。
options
文档
可选。用于修改计数的额外选项。

options 文档包含以下字段:

字段
类型
说明
limit
整型
可选。要计数的最大文档数。
skip
整型
可选。计数前要跳过的文档。
hint
字符串或文档
可选。该查询的索引名称提示或规范。
maxTimeMS
整型
可选。允许查询运行的最长时间。
readConcern
字符串

可选。指定读关注。默认级别为 "local"

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

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

collation
文档

可选。

指定用于操作的排序规则

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

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

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

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

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

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

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

count() 相当于 db.collection.find(query).count() 结构。

提示

另请参阅:

在没有查询谓词的情况下调用 count(),可能会收到不准确的文档数。如果没有查询谓词,count() 方法会根据集合的元数据返回结果,这可能会得出近似计数。尤其是,

对于基于集合元数据的计数,另请参阅带有计数选项的 CollStats 管道阶段

您无法在事务中使用 count 以及 Shell 助手 count()db.collection.count()

有关详情,请参阅事务和计数操作

在分片集群上,如果存在孤立文档或正在进行数据块迁移,则没有查询谓词的 db.collection.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 根据集合的元数据返回近似计数。

请考虑具有以下索引的集合:

{ a: 1, b: 1 }

执行计数时,如果满足以下条件,MongoDB 可以仅使用索引返回计数:

  • 查询可以使用索引,

  • 查询只包含索引键的条件,并且

  • 查询谓词访问索引键的一个单一连续范围。

例如,以下操作可以仅使用索引返回计数:

db.collection.find( { a: 5, b: 5 } ).count()
db.collection.find( { a: { $gt: 5 } } ).count()
db.collection.find( { a: 5, b: { $gt: 10 } } ).count()

但是,如果查询可以使用索引,但查询谓词不访问单个连续范围的索引键,或者查询还包含索引外部字段的条件,那么除了使用索引之外,MongoDB 还必须读取文档才能返回计数。

db.collection.find( { a: 5, b: { $in: [ 1, 2, 3 ] } } ).count()
db.collection.find( { a: { $gt: 5 }, b: 5 } ).count()
db.collection.find( { a: 5, b: 5, c: 5 } ).count()

在这种情况下,在初次读取文档期间,MongoDB 会将文档分页到内存中,这样后续调用相同的计数操作就会有更好的性能。

在使用 Wired Tiger 存储引擎非正常关闭 mongod 后,count() 报告的计数统计数据可能不准确。

偏差的大小取决于在最后一个检查点和非正常关闭之间执行的插入、更新或删除操作的次数。检查点通常每 60 秒出现一次。但是,如果 mongod 实例使用了非默认的 --syncdelay 设置,则检查点出现的次数可能会增多或减少。

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

非正常关闭后:

注意

这种精度损失只适用于包含查询谓词的 count() 操作。

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

要计算 orders 集合中所有文档的数量,请使用以下操作:

db.orders.count()

该操作等同于以下操作:

db.orders.find().count()

计算 orders 集合中字段 ord_dt 的值晚于 new Date('01/01/2012') 的文档数量:

db.orders.count( { ord_dt: { $gt: new Date('01/01/2012') } } )

该查询等效于以下:

db.orders.find( { ord_dt: { $gt: new Date('01/01/2012') } } ).count()

后退

db.collection.configureQueryAnalyzer