当结果集很大时,mongodb.countDocuments速度很慢,即使使用了索引

当结果集很大时,mongodb.countDocuments速度很慢,即使使用了索引,mongodb,Mongodb,当结果集较大时,mongodb.countDocuments速度较慢 关于用户集合的测试数据: 10M状态为“活动”的文档 状态为“非活动”的100k文档 字段status已编制索引{status:1} db.users.countDocuments({status:'active'})需要2.91秒 db.users.countDocuments({status:'inactive'})需要0.018秒 我知道,countDocuments使用聚合来查找和计算结果 estimatedDoc

当结果集较大时,
mongodb.countDocuments
速度较慢

关于用户集合的测试数据:

  • 10M状态为“活动”的文档
  • 状态为“非活动”的100k文档
字段
status
已编制索引{status:1}

db.users.countDocuments({status:'active'})
需要2.91秒
db.users.countDocuments({status:'inactive'})
需要0.018秒

我知道,
countDocuments
使用聚合来查找和计算结果

estimatedDocumentCount
()在这种情况下不起作用,因为需要查询筛选器

有什么改进的建议吗?

计数似乎是应该便宜的事情之一,但通常不是。因为mongo不维护与b树索引中特定条件匹配的文档数量计数,所以它需要在运行时扫描索引计数文档。这意味着计算100倍的文档将花费100倍的时间,这大致就是我们在这里看到的--
0.018*100=1.8s

要加快速度,您有几个选项:

  • 活动计数大致为
    estimatedDocumentCount()-db.users.countDocuments({status:'inactive'})
    。对于您的用例,这是否足够准确
  • 或者,您可以在一个单独的集合中维护
    计数
    文档,该集合与您拥有的活动/非活动文档的数量保持同步

  • 感谢willis选项1是一个很好的选项,但如果我不知道哪个状态的文档数较低,那么它就会有问题选项2就是我现在所做的,只需要确认没有更好的方法来实现这一点,所以我将按照mongodb count最佳实践来保存它