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
相关推荐
爱可生开源社区10 小时前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
AI全栈实验室14 小时前
MongoDB迁移金仓踩了5个坑,最后一个差点回滚
mongodb
随逸17714 小时前
《从零搭建NestJS项目》
数据库·typescript
加号31 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏1 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐1 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再1 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest1 天前
数据库SQL学习
数据库·sql
jnrjian1 天前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle
十月南城1 天前
数据湖技术对比——Iceberg、Hudi、Delta的表格格式与维护策略
大数据·数据库·数据仓库·hive·hadoop·spark