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
相关推荐
建投数据29 分钟前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi1 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀2 小时前
Redis梳理
数据库·redis·缓存
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天2 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺2 小时前
分布式系统架构:服务容错
数据库·架构
独行soc3 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain4 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship4 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站4 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle