mongo:aggregate - 在$ project之前$ match

时间:2013-02-20 18:21:32

标签: mongodb aggregation-framework

在$ match表达式中有一个大约100GB数据的mongodb和每个字段,我有一个索引(单字段索引)。

现在我尝试了aggregate()并将$ project作为管道中的第一部分,$ match匹配。

聚合运行并返回正确的结果,但需要几个小时!这是否真的只处理过滤后的($ match)数据,或者mongo是否在整个数据范围内聚合并在之后进行过滤?

在我的测试用例中,$ match过滤器大约150MB(而不是100GB的完整数据大小)。

偶然地,我改变了顺序并在管道定义中的$ project之前写了$ match。这样,它就在几秒钟内完成。

mongodb通常何时减少输入数据,是否也处理$ match中字段的索引?

1 个答案:

答案 0 :(得分:2)

正如您所注意到的,管道运营商的顺序非常重要,尤其是在处理大型集合时。如果操作不正确,您可能会耗尽内存,更不用说这个过程需要很长时间。如上所述in the docs

  

以下管道运营商在利用索引时会利用它们   发生在管道的开头:

$match 
$sort 
$limit 
$skip.

只要$match出现在前面,就可以使用索引。还注意到in the docs

  

MongoDB聚合管道从一个流传输MongoDB文档   管道操作员到下一个处理文件。管道   操作员可以在管道中重复。

这意味着,如果$project前面有$match,则{{1}}只会看到整个集合的一小部分。