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
相关推荐
葫芦和十三5 小时前
图解 MongoDB 02|BSON:你以为存的是 JSON,其实是带类型的二进制
后端·mongodb·agent
葫芦和十三5 小时前
图解 MongoDB 01|文档数据库
后端·mongodb·agent
倔强的石头_20 小时前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
冬奇Lab1 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
ClouGence2 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
无响应de神2 天前
三、用户与权限管理
数据库·mysql
✎ ﹏梦醒͜ღ҉繁华落℘3 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
麦聪聊数据3 天前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡3 天前
【MySQL数据库】数据类型与表约束
数据库·mysql