MongoDB的估计计数查询有多精确?

20

据我所知,官方 MongoDB 驱动程序提供了“计数”和“估计文档计数”API。前者命令非常占用内存,因此建议在需要时使用后者。

但是,这个估计的文档计数有多准确?在生产环境中是否可以信任计数,或者当需要绝对准确性时推荐使用计数 API?


3
@Neil: 我不认为这是另一个问题的重复——那个问题是在2015年提出的,在estimatedDocumentCount()存在之前,那里只有一个答案间接地提到了该方法。 - Dan Dascalescu
只需要使用count()函数即可,虽然它已经过时了,但仍然可以正常工作并且比其他函数快。 - ajsp
3个回答

21

在我看来,比较这两者时很难想象一种情况需要使用countDocuments()而不是estimatedDocumentCount()

也就是说,estimatedDocumentCount()的等效形式是countDocuments({}),即一个空的查询过滤器。第一个函数的成本为O(1);而第二个函数的成本为O(N),如果N非常大,则成本将是禁止的。

两者都返回一个计数,在Mongo被部署的情况下,这个计数很可能是相当短暂的,即它一旦被获取就会失准,因为集合发生了变化。


7
如果您想得出满足某个查询条件的文档总数,那么估计数量显然是不够准确的。例如,在执行服务器端分页并且想要知道总页数时,这是必需的。 - Avius
1
问题是关于estimatedDocumentCount(),它与查询无关。如果您正在寻找满足某些查询条件的文档总数,则(a)不能使用estimatedDocumentCount(),(b)也不会使用countDocuments()的无参版本。 - Allan Bazinet

10
请查看MongoDB文档的estimatedDocumentCount()部分,特别是他们提到"在使用Wired Tiger存储引擎的mongod出现不干净的关闭后,db.collection.estimatedDocumentCount()报告的计数统计可能不准确。"这是由于元数据用于计数和检查点漂移,通常会在60秒左右解决。

相比之下,countDocuments()的MongoDB文档指出,此方法是一个包装器,执行$group聚合阶段来$sum结果集,确保计数的绝对准确性。

因此,如果绝对准确性很重要,则使用countDocuments()。 如果您只需要大致估算,请使用estimatedDocumentCount()。 名称准确地反映了其用途,应相应地使用。


0

主要的区别在于过滤。

count_documents 可以像普通查询一样进行过滤,而 estimated_document_count 则不能。

如果过滤不是您使用情况的一部分,那么我建议使用 estimated_document_count,因为它速度更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接