2013-02-20 51 views
2

前$比赛有一个MongoDB的周围数据的100GB和每个在$匹配表达式场,我有一个指数(单场指数)。

现在我试图汇总(),并在这背后的管道,$匹配写道$项目的第一部分。

聚合运行并返回正确的结果,但需要数小时!这是真的只处理过滤后的($匹配)数据,还是mongo会聚合全部数据并过滤?

在我的测试情况下,150MB左右比赛$过滤器(而非100GB的全数据的大小)。

无意间,我改变了顺序,并在管道定义$项目之前写的$匹配。这样,它在几秒钟内完成。

什么时候MongoDB中通常会降低输入的数据,但它也应对在$匹配字段中的指数?

回答

2

正如您已经注意到的,管道操作员的顺序非常重要,特别是在处理大型收集时。如果做得不正确,你可能会耗尽内存,更不用说花费很长时间的过程。如前所述in the docs

下,当他们 在管道的开始发生管道运营商采取指数的优势:

$match 
$sort 
$limit 
$skip. 

所以只要$match出现前你索引可以使用。还指出in the docs

MongoDB的聚合管道流MongoDB的文件从一个 管道运营商下一个要处理的文件。管道 操作员可以在管道中重复。

这意味着,你$project只能看到整个集合的一小部分,如果它是由前$match

+0

我在找到令人震惊的聚合框架。能够以任何你喜欢的方式订购操作员真的打开了世界的可能性。这个答案帮助我意识到'$ project'后可以'$ match',这样我就可以过滤'$ project'后的字段。 – Rohmer 2016-10-16 21:34:20