【问题标题】:How accurate is MongoDB's estimated count query?MongoDB 的估计计数查询有多准确?
【发布时间】:2019-05-01 16:37:03
【问题描述】:

官方 MongoDB 驱动程序提供了“计数”和“估计文档计数”API,据我所知,前一个命令是高度内存密集型的,因此建议在需要它的情况下使用后者。

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

【问题讨论】:

  • @Neil:我不认为这是另一个问题的重复——那个问题是在 2015 年提出的,早于estimatedDocumentCount() 存在,并且只有一个答案与该方法相切。
  • 只用 count(),它已经被贬值了,但它仍然有效,而且比两者都快。

标签: mongodb


【解决方案1】:

比较这两者,对我来说,当estimatedDocumentCount() 是一个选项时,很难想象出一个你想使用countDocuments() 的场景。

也就是说,estimatedDocumentCount() 的等效形式是countDocuments({}),即一个空的查询过滤器。第一个函数的代价是O(1);第二个是O(N),如果N非常大,成本会让人望而却步。

两者都返回一个计数,在部署 Mongo 的场景中,它可能是非常短暂的,即,随着集合的变化,它在你拥有它的那一刻是不准确的。

【讨论】:

  • 如果您想得出满足某些查询的文档总数,估计计数显然不好。这是必需的,例如执行服务器端分页时,您想知道总页数。
  • 问题是关于estimatedDocumentCount(),这与查询无关。如果您正在寻找满足某个查询的文档总数,那么您 (a) 不能使用 estimatedDocumentCount() 并且 (b) 不会使用无参数版本的 countDocuments()
【解决方案2】:

请查看MongoDB documentation for estimatedDocumentCount()。具体来说,他们指出“在使用 Wired Tiger 存储引擎不正常关闭 mongod 后,db.collection.estimatedDocumentCount() 报告的计数统计信息可能不准确。”这是由于元数据用于计数和检查点漂移,通常会在 60 秒左右后解决。

相比之下,MongoDB documentation for countDocuments() 声明此方法是一个包装器,它执行$group 聚合阶段到$sum 结果集,确保计数的绝对准确性。

因此,如果绝对准确性至关重要,请使用countDocuments()。如果您只需要粗略估计,请使用estimatedDocumentCount()。这些名称与其用途相符,应相应地使用。

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 2015-05-14
    • 2022-11-09
    • 2019-02-04
    • 1970-01-01
    • 2013-03-13
    • 2021-12-06
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多