2013-12-08 438 views
12

我试图使用聚合框架与$match$group阶段。 $group阶段使用索引数据吗?我正在使用最新的可用mongodb版本 - 2.5.4

+0

[Mongodb indexing for aggregates]的可能重复(http://stackoverflow.com/questions/20170636/mongodb-indexing-for-aggregates) – WiredPrairie

回答

31

$group不使用索引数据。

从MongoDB的docs

,当他们出现在管道开头的$匹配和$ SORT管道运营商可以利用索引的优势。

$ geoNear管道运算符利用地理空间索引。 使用$ geoNear时,$ geoNear管线操作必须在聚合管道中显示为 第一个阶段。

+0

您的第一句与您答案的其余部分矛盾:只要$ group是管道的第二个阶段,第一个是与$组相同的字段$ sort,索引*将被使用。 –

+0

@ArthurTacca:$ sort阶段将使用索引,但$ group阶段不会。 – 4J41

+1

我认为你有点迂腐:如果$ sort阶段使用索引,并且$ group阶段使用排序的结果来避免昂贵的扫描,那么我会说$ group已经使用索引。您的文档引用不会说$ group是否利用了前面的$类型,所以我认为您没有真正回答原始问题的意图。 (之前在你的3.2文档回答中的引用强烈表明答案是“是”,因此我的原始评论;来自3.4文档的新引用不太明显,但仍不明确。) –

0

由于4J41的回答说,$group不(直接)使用一个索引,虽然$sort做,如果它是在管道的第一阶段。但是,$group原则上可能会有一个优化实现,如果它紧跟在$sort后面,在这种情况下,您可以通过事先放置$sort来有效利用索引。

关于$group是否有这种优化(尽管我敢打赌如果确实如此,那么这表明它不会),似乎并没有直接的答案。答案是MongoDB bug 4507:目前$group没有这个实现,所以4J41答案的第一行就是最后一个。如果您确实需要效率,则根据应用程序的不同,使用常规查询并在您的客户端代码中进行分组可能最快。