为什么MongoDB find具有与count相同的性能

时间:2018-10-23 13:45:13

标签: mongodb database-performance

我正在针对我的MongoDB运行测试,由于某种原因,findcount的性能相同。

统计: 订单收集大小:〜20M, 带有product_id 6的订单:〜5K

product_id被索引以提高性能。

查询:db.orders.find({product_id: 6})db.orders.find({product_id: 6}).count()

0.08ms后得出产品订单与5K的对比

为什么计数没有显着加快?可以找到带有product_id索引的第一个和最后一个元素位置

1 个答案:

答案 0 :(得分:1)

正如Mongo documentation for count所述,调用count与调用find相同,但是它不返回文档,而是对其进行计数。为了执行此计数,请在光标上进行迭代。它不能只读取索引并根据某个ID的第一个值和最后一个值来确定文档数,尤其是因为您可以在非ID的其他字段上拥有索引(并且Mongo ID不会自动递增)。因此,findcount基本上是相同的操作,但是它不会获取文档,而只是遍历它们并求和它们的编号并将其返回给您。

此外,如果您想获得更快的结果,可以使用estimatedDocumentsCountdocs),它可以直接用于集合的元数据。这导致无法询问“如果触发此查询,我可以期待多少文档?”。如果您需要以更快的方式查找查询文档的数量,则可以使用countDocumentsdocs),它是聚合查询的包装器。据我对Mongo的了解,所提供的查询似乎是一种无需调用count即可计算查询结果的最快方法。我猜想这应该是从现在开始计数文档的性能的首选方法(因为它是在4.0.3版中引入的。)