MongoDB:空查询的count()为何未被优化?
为什么MongoDB执行count()时会走聚合而非直接读取元数据
强一致性要求:MongoDB元数据中的文档计数(比如
db.collection.stats().count)是异步维护的近似值,会滞后于实时的增删改操作,也不考虑未提交的事务。如果你的count()请求需要精确的强一致性结果,MongoDB就会通过聚合(空$match+$group求和)来扫描集合统计,确保结果准确。分片集群环境:在分片集群中,元数据的集合总数是各分片节点近似计数的总和,无法保证全局强一致——比如数据分片迁移、跨分片写操作的延迟都会导致元数据计数不准。这种情况下,无过滤的
count()会通过分布式聚合来跨分片统计精确总数。API行为的版本差异:MongoDB 3.6+开始,官方推荐用
countDocuments()替代老的count()。countDocuments()默认采用聚合方式实现精确计数;而如果想读取元数据的近似计数,应该使用estimatedDocumentCount(),这个方法才会直接读取元数据返回结果,速度极快但结果是近似值。
如果你追求计数速度而非绝对精确,可以替换为db.collection.estimatedDocumentCount(),它会直接读取元数据返回近似总数,耗时可以忽略。
内容的提问来源于stack exchange,提问作者greenButMellow
相关产品推荐
相关产品推荐

