mongo:聚合 - $project 之前的 $match

led*_*edy 4 mongodb aggregation-framework

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

现在我尝试了aggregate()并将$project写为管道中的第一部分,$match在其后面。

聚合运行并返回正确的结果,但需要几个小时!这是否真的只处理过滤后的($match)数据,还是 mongo 聚合所有数据并随后进行过滤?

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

不小心,我改变了顺序,在管道定义中将 $match 写在 $project 之前。这样,几秒钟之内就完成了。

mongodb通常什么时候减少输入数据并且它也处理$match中字段的索引?

Sri*_*ran 6

正如您所注意到的,管道运算符的顺序非常重要,尤其是在处理大型集合时。如果操作不当,您可能会耗尽内存,更不用说该过程需要很长时间了。如文档中所述:

以下管道运算符在出现在管道开头时会利用索引:

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

所以只要$match出现在前面你的索引就可以使用。文档中也注明了

MongoDB 聚合管道将 MongoDB 文档从一个管道运算符流式传输到下一个管道运算符以处理文档。管道运算符可以在管道中重复。

这意味着$project如果前面带有 . 则您只能看到整个集合的一小部分$match