db.collection.countDocuments()
带驱动程序的 MongoDB
本页面提供 mongosh
方法的相关信息。要查看 MongoDB 驱动程序中的等效方法,请参阅编程语言的相应页面:
定义
db.collection.countDocuments(query, options)
返回一个整数,表示与集合或视图的查询匹配的文档数。 此方法可用于事务。
兼容性
可以使用 db.collection.countDocuments()
查找托管在以下环境中的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
countDocuments()
方法采用以下形式:
db.collection.countDocuments( <query>, <options> )
countDocuments()
方法使用以下参数:
Parameter | 类型 | 说明 |
---|---|---|
查询 | 文档 | 查询选择条件。要计算所有文档,请指定一个空文档。另请参阅查询限制。 |
选项 | 文档 | 可选。影响计数行为的额外选项。 |
options
文档可以包含:
字段 | 类型 | 说明 |
---|---|---|
limit | 整型 | 可选。要计数的最大文档数。 |
skip | 整型 | 可选。计数前要跳过的文档。 |
hint | 字符串或文档 | 可选。用于查询的索引名称或索引规范。 |
maxTimeMS | 整型 | 可选。允许计数运行的最长时间。 |
行为
机制
与 db.collection.count()
不同,db.collection.countDocuments()
不使用元数据来返回该计数。而会执行文档聚合以返回准确的计数,在非正常关闭之后或分片集群中存在孤立文档的情况下亦是如此。
db.collection.countDocuments()
封装以下聚合操作并仅返回 n
值:
db.collection.aggregate([ { $match: <query> }, { $group: { _id: null, n: { $sum: 1 } } } ])
空或不存在的集合和视图
db.collection.countDocuments()
在空集合或不存在的集合或视图上返回 0
。
查询限制
在 db.collection.countDocuments()
的查询表达式中不能使用以下查询操作符:
限制性操作符 | 替代方案 | |
---|---|---|
改用 $expr 。 | ||
作为替代方案,请改为使用包含
| ||
作为替代方案,请改为使用包含
|
事务
db.collection.countDocuments()
可以在分布式事务中使用。
在事务中使用 db.collection.countDocuments()
时,生成的计数不会过滤任何未提交的多文档事务。
重要
在大多数情况下,与单文档写入操作相比,分布式事务会产生更高的性能成本,并且分布式事务的可用性不应取代有效的模式设计。在许多情况下,非规范化数据模型(嵌入式文档和数组)仍然是数据和使用案例的最佳选择。换言之,对于许多场景,适当的数据建模将最大限度地减少对分布式事务的需求。
有关其他事务使用注意事项(如运行时间限制和 oplog 大小限制),另请参阅生产注意事项。
客户端断开连接
从 MongoDB 4.2 开始,如果在操作完成之前,发出 db.collection.countDocuments()
的客户端断开连接,MongoDB 将使用killOp
将 db.collection.countDocuments()
标记为终止。
示例
对集合中的所有文档计数
要计算 orders
集合中的文档数量,请使用以下操作:
db.orders.countDocuments( {}, { hint: "_id_"} )
注意
如果将 db.collection.countDocuments()
与空查询过滤器一起使用,MongoDB 将执行完全集合扫描,这可能会使效率低下。为了提高性能,此示例指定 hint()
来使用自动生成的 _id
索引。还可以使用查找所有文档(如 { "_id": { $gte: MinKey } }
)的查询过滤器来使用索引对所有文档进行计数。
统计与查询匹配的所有文档
计算 orders
集合中字段 ord_dt
的值晚于 new
Date('01/01/2012')
的文档数量:
db.orders.countDocuments( { ord_dt: { $gt: new Date('01/01/2012') } }, { limit: 100 } )