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()
操作,而是计算并返回与查询匹配的结果数。
兼容性
可以使用 db.collection.count()
查找托管在以下环境中的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
该方法采用以下参数:
Parameter | 类型 | 说明 |
---|---|---|
query | 文档 | 查询选择条件。 |
options | 文档 | 可选。用于修改计数的额外选项。 |
options
文档包含以下字段:
字段 | 类型 | 说明 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
limit | 整型 | 可选。要计数的最大文档数。 | ||||||||||
skip | 整型 | 可选。计数前要跳过的文档。 | ||||||||||
hint | 字符串或文档 | 可选。该查询的索引名称提示或规范。 | ||||||||||
maxTimeMS | 整型 | 可选。允许查询运行的最长时间。 | ||||||||||
readConcern | 字符串 | 为确保单个线程可以读取自己的写入内容,请对副本集的主节点使用 要使用读关注级别 | ||||||||||
collation | 文档 | 可选。 指定用于操作的排序规则。 排序规则允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音符号规则。 排序规则选项的语法如下:
指定排序规则时, 如果未指定排序规则,但集合具有默认排序规则(请参阅 如果没有为收集或操作指定排序规则,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 } } ] )
索引使用
请考虑具有以下索引的集合:
{ 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 将使用killOp
将 db.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()