MongoDB {aggregation $ match} vs {find} speed

Owu*_*aro 45 mongodb aggregation-framework

我有一个包含数百万行的mongoDB集合,我正在尝试优化我的查询.我目前正在使用聚合框架来检索数据并根据需要对它们进行分组.我的典型聚合查询类似于:$match > $group > $ group > $project

但是,我注意到最后的部分只花了几毫秒,开始是最慢的.

我尝试仅使用$ match过滤器执行查询,然后使用collection.find执行相同的查询.聚合查询需要大约80毫秒,而查询查询需要0或1毫秒.

我几乎每个字段都有索引,所以我想这不是问题.什么可能出错?或者它只是聚合框架的"正常"缺点?

我可以使用查找查询而不是聚合查询,但是我必须在请求之后执行大量处理,并且这个过程可以快速完成$group等等,所以我宁愿保留聚合框架.

谢谢,

编辑:

这是我的标准:

{
    "action" : "click",
    "timestamp" : {
            "$gt" : ISODate("2015-01-01T00:00:00Z"),
            "$lt" : ISODate("2015-02-011T00:00:00Z")
    },
    "itemId" : "5"
}
Run Code Online (Sandbox Code Playgroud)

vla*_*zam 25

这样做的主要目的aggregation framework是简化对大量条目的查询,并生成少量可为您带来价值的结果.

如您所述,您也可以使用多个find查询,但请记住,您无法使用find查询创建新字段.另一方面,$group舞台允许您定义新字段.

如果你想实现它的功能aggregation framework,你很可能必须运行一个初始find(或链接几个),拉出该信息并用编程语言进一步操作它.

aggregation pipeline似乎需要更长的时间,但至少你知道,你只需要考虑一个系统的性能- MongoDB的引擎.

然而,当涉及操纵从find查询返回的数据时,您很可能必须使用编程语言进一步操纵数据,从而根据所选编程语言的复杂性增加复杂性.

  • 谢谢你的信息.但是,我仍然不明白为什么只有$ match过滤器的聚合查询没有具有相同过滤器的简单查找查询那么快. (28认同)

har*_*had 8

您是否尝试过使用explain()来查找查询?它会让你很好地了解find()查询将花费多少时间.您可以使用$ explain与$ match进行相同操作,并查看索引访问和其他参数是否存在任何差异.

此外,聚合框架的$ group部分不使用索引,因此它必须处理$ match stage of aggregation framework返回的所有记录.因此,为了更好地理解查询的工作原理,请查看它返回的结果集以及它是否适合MongoDB处理的内存.