我正在针对我的MongoDB运行测试,由于某种原因,find
与count
的性能相同。
统计: 订单收集大小:〜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索引的第一个和最后一个元素位置
答案 0 :(得分:1)
正如Mongo documentation for count所述,调用count
与调用find
相同,但是它不返回文档,而是对其进行计数。为了执行此计数,请在光标上进行迭代。它不能只读取索引并根据某个ID的第一个值和最后一个值来确定文档数,尤其是因为您可以在非ID的其他字段上拥有索引(并且Mongo ID不会自动递增)。因此,find
和count
基本上是相同的操作,但是它不会获取文档,而只是遍历它们并求和它们的编号并将其返回给您。
此外,如果您想获得更快的结果,可以使用estimatedDocumentsCount
(docs),它可以直接用于集合的元数据。这导致无法询问“如果触发此查询,我可以期待多少文档?”。如果您需要以更快的方式查找查询文档的数量,则可以使用countDocuments
(docs),它是聚合查询的包装器。据我对Mongo的了解,所提供的查询似乎是一种无需调用count
即可计算查询结果的最快方法。我猜想这应该是从现在开始计数文档的性能的首选方法(因为它是在4.0.3版中引入的。)