聚合框架不能使用索引

meo*_*hia 3 indexing mongodb

我运行这个命令:

db.ads_view.aggregate({$ group:{_ id:"$ campaign","action":{$ sum:1}}});

ads_view:500 000个文件.

这个查询需要1.8s.这是它的简介:https://gist.github.com/afecec63a994f8f7fd8a

indexed:db.ads_view.ensureIndex({campaign:1});

但是mongodb不使用索引.任何人都知道是否可以聚合框架使用索引,如何索引此查询.

seb*_*ian 12

这是一个迟到的答案,但由于$group在 4.0 版的 Mongo 中仍然不会使用索引,因此它可能对其他人有帮助。

要显着加快聚合速度,请执行 a $sortbefore $group

所以你的查询将变成:

db.ads_view.aggregate({$sort:{"campaign":1}},{$group: {_id : "$campaign", "action" : {$sum: 1} }});
Run Code Online (Sandbox Code Playgroud)

这假设在 上campaign有一个索引,它应该是根据您的问题创建的。在 Mongo 4.0 中,使用db.ads_view.createIndex({campaign:1}).

我在包含 5.5+ Mio 的集合上对此进行了测试。文件。没有$sort,即使在几个小时后聚合也不会完成;使用$sortpreceeding $group,聚合需要几秒钟。


Ada*_*ord 6

$group运营商不是目前使用索引的运营商之一.执行的操作符列表(从2.2开始)是:

$match
$sort
$limit
$skip
Run Code Online (Sandbox Code Playgroud)

从这里:

http://docs.mongodb.org/manual/applications/aggregation/#pipeline-operators-and-indexes

根据要点中的产量数量,我假设你有一个非常活跃的实例,或者当你做这个组时,很多这些数据都不在内存中(它通常也会产生页面错误),因此1.8s

请注意,即使$group可以使用索引,并且您的索引涵盖了所有正在分组的内容,它仍然会涉及完整扫描索引以执行该组,并且无论如何都可能不会很快.