MongoDB count 性能

在MongoDB 4.0之前,你可以使用以下方法来查询文档数量:

1. count 方法:

在MongoDB 4.0之前,count 是最常用的统计文档数量的方法。

它可以与查询条件一起使用,直接返回匹配条件的文档数量。

javascript 复制代码
db.collection.count({ query });

注意: 在MongoDB 4.0之后,count 方法虽然仍然可用,但官方建议使用 countDocuments 来代替它,因为 count 的准确性在某些情况下可能会受到影响(例如集合存在分片时)。

2. estimatedDocumentCount 方法:

estimatedDocumentCount 返回集合中的文档数量的估计值,不适用于复杂的查询条件。

它更快,因为它是基于集合的元数据,而不是实际扫描文档。

javascript 复制代码
db.collection.estimatedDocumentCount();

适用场景: 当你需要快速获取集合中大致的文档数量时,适用于大集合和不需要精确计数的情况。

3. countDocuments 方法(MongoDB 4.0及之后推荐):

在MongoDB 4.0及之后,countDocuments 是推荐使用的方式,因为它在查询复杂条件时更加准确。

count 方法相比,它会在评估查询时考虑集合的筛选器和索引。

javascript 复制代码
db.collection.countDocuments({ query });

countDocuments 在内部类似于一个带有 aggregate 操作的查询。

具体来说,countDocuments 是通过构建一个带有 $match 阶段的聚合管道来实现的,这个 $match 阶段会使用传入的查询条件来筛选文档,然后再通过 $group 阶段进行计数。这种方式可以确保在使用复杂查询条件时,计数结果是准确的。

具体过程:
  1. $match 阶段:应用你提供的查询条件,过滤出符合条件的文档。
  2. $group 阶段:对筛选出的文档进行分组和计数,最终返回符合条件的文档数量。
示例代码:
javascript 复制代码
db.collection.aggregate([
  { $match: { /* your query conditions */ } },
  { $group: { _id: null, count: { $sum: 1 } } }
]);

为什么选择 countDocuments

  • 准确性:countDocuments 会考虑查询的过滤条件和索引,确保在有条件筛选时计数结果是准确的。
  • 性能:尽管内部类似于 aggregatecountDocuments 针对这种计数场景进行了优化,通常比手动构建的 aggregate 更高效。

总结:

在MongoDB 4.0之前,你可以继续使用 count 方法来统计文档数量。

如果你在使用MongoDB 4.0或之后的版本,建议迁移到 countDocuments,以确保查询的准确性和性能。

如果你仅需估算文档数量而不需要精确计数,estimatedDocumentCount 是更高效的选择。

在 MongoDB 3.6 单机 (未分片) 的实践经验

estimatedDocumentCount 速度最快, 不可靠, 不能使用查询条件

和实际文档数据不一致, 甚至有时候会出现文档数量是负数. 但是比率很低, 绝大多数情况还是准确的.

countDocuments 在低版本不支持 hint

虽然官方的文档中有显示支持 hint, 但是实际上确不支持.

count 支持 hint

速度和 countDocuments 差不多, 但是支持 hint

结论

  • 如果可以接受不是 100% 准确并且没有查询条件(查看整个集合的数量), 使用 estimatedDocumentCount.
  • 如果有查询条件, 选择 count
相关推荐
·薯条大王4 小时前
MySQL联合查询
数据库·mysql
morris1316 小时前
【redis】redis实现分布式锁
数据库·redis·缓存·分布式锁
hycccccch6 小时前
Canal+RabbitMQ实现MySQL数据增量同步
java·数据库·后端·rabbitmq
这个懒人7 小时前
深入解析Translog机制:Elasticsearch的数据守护者
数据库·elasticsearch·nosql·translog
Yan-英杰7 小时前
【百日精通JAVA | SQL篇 | 第二篇】数据库操作
服务器·数据库·sql
NineData7 小时前
NineData云原生智能数据管理平台新功能发布|2025年3月版
数据库
百代繁华一朝都-绮罗生9 小时前
检查是否存在占用内存过大的SQL
数据库·sql
吾日三省吾码9 小时前
Python 脚本:自动化你的日常任务
数据库·python·自动化
CZIDC9 小时前
win11 系统环境下 新安装 WSL ubuntu + ssh + gnome 桌面环境
数据库·ubuntu·ssh
直裾9 小时前
Mapreduce的使用
大数据·数据库·mapreduce