带驱动程序的 MongoDB
定义
db.collection.countDocuments(query, options)返回一个整数,代表与该集合或视图的查询匹配的文档数量。此方法可用于事务。
兼容性
此方法可用于以下环境中托管的部署:
- MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud
注意
This command is supported in all MongoDB Atlas clusters. For information on Atlas support for all commands, see Unsupported Commands.
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
countDocuments()方法采用以下形式:
db.collection.countDocuments( <query>, <options> )
参数
countDocuments() 方法采用以下参数:
Parameter | 类型 | 说明 |
|---|---|---|
查询 | 文档 | 查询选择条件。要计算所有文档,请指定一个空文档。另请参阅查询限制。 |
选项 | 文档 | 可选。影响计数行为的额外选项。 |
options 文档可以包含:
字段 | 类型 | 说明 |
|---|---|---|
| 整型 | 可选。要计数的最大文档数。 |
| 整型 | 可选。计数前要跳过的文档。 |
| 字符串或文档 | 可选。用于查询的索引名称或索引规范。 |
| 整型 | 可选。允许计数运行的最长时间。 |
行为
机制
与 db.collection.count() 不同,countDocuments() 不使用元数据来返回计数。相反,它会执行文档聚合以返回准确的计数,即使在非正常关闭之后或分片集群中存在孤立文档时也是如此。
countDocuments() 封装以下聚合操作并仅返回 n 的值:
db.collection.aggregate([ { $match: <query> }, { $group: { _id: null, n: { $sum: 1 } } } ])
空或不存在的集合和视图
countDocuments() 对空或不存在的集合或视图返回 0。
查询限制
不能将以下查询运算符用作 countDocuments() 的查询表达式的一部分:
限制性操作符 | 替代方案 | |
|---|---|---|
改用 | ||
作为替代方案,请改为使用包含 | ||
作为替代方案,请改为使用包含 |
事务
countDocuments() 可用于分布式事务。
当您在ACID 事务中使用 countDocuments() 时,生成的计数不会过滤掉任何未提交的多文档事务。
重要
在大多数情况下,与单文档写入操作相比,分布式事务会产生更高的性能成本,并且分布式事务的可用性不应取代有效的模式设计。在许多情况下,非规范化数据模型(嵌入式文档和数组)仍然是数据和使用案例的最佳选择。换言之,对于许多场景,适当的数据建模将最大限度地减少对分布式事务的需求。
有关其他事务使用注意事项(如运行时间限制和 oplog 大小限制),另请参阅生产注意事项。
客户端断开连接
如果发出 countDocuments() 的客户端在操作完成之前断开连接,则MongoDB使用killOp将 countDocuments() 标记为终止。
示例
本页上的示例使用来自 sample_mflix 数据集的数据。有关如何将此数据集加载到您的自管理 MongoDB 部署中的详细信息,请参阅 加载示例数据集。如果您对示例数据库进行了任何修改,您可能需要删除并重新创建数据库,才能运行此页面上的示例。
对集合中的所有文档计数
要计算 movies 集合中的文档数量,请使用以下操作:
db.movies.countDocuments( { }, { hint: "_id_"} )
注意
如果将 db.collection.countDocuments() 与空查询过滤器一起使用,MongoDB 将执行完全集合扫描,这可能会使效率低下。为了提高性能,此示例指定 hint() 来使用自动生成的 _id 索引。还可以使用查找所有文档(如 { "_id": { $gte: MinKey } } )的查询过滤器来使用索引对所有文档进行计数。
统计与查询匹配的所有文档
此示例计算 movies集合中 directors字段包含 "David Lynch" 的文档数量:
db.movies.countDocuments( { directors: "David Lynch" } )