Mongodb mongo:聚合-$项目前的$匹配

Mongodb mongo:聚合-$项目前的$匹配,mongodb,aggregation-framework,Mongodb,Aggregation Framework,在$match表达式中有一个大约100GB数据和每个字段的mongodb,我有一个索引(单字段索引) 现在我尝试了aggregate()并编写了$project作为管道的第一部分,$match 聚合将运行并返回正确的结果,但需要几个小时!这真的只是处理过滤后的($match)数据,还是mongo对整个数据范围进行聚合,然后进行过滤 在我的测试用例中,$match过滤器大约150MB(而不是100GB的完整数据大小) 无意中,我更改了顺序,并在管道定义中在$project之前写了$match。这样

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

现在我尝试了aggregate()并编写了$project作为管道的第一部分,$match

聚合将运行并返回正确的结果,但需要几个小时!这真的只是处理过滤后的($match)数据,还是mongo对整个数据范围进行聚合,然后进行过滤

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

无意中,我更改了顺序,并在管道定义中在$project之前写了$match。这样,它在几秒钟内就完成了


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

正如您所注意到的,管道操作符的顺序非常关键,尤其是在处理大型集合时。如果操作不正确,您可能会耗尽内存,更不用说进程需要很长时间。如前所述:

以下管道运算符在执行以下操作时利用索引 在管道开始时发生:

$match 
$sort 
$limit 
$skip.
所以只要
$match
出现在前面,就可以使用索引。还注意到

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


这意味着您的
$project
如果前面有一个
$match

我发现聚合框架非常惊人,那么它只能看到整个集合的一小部分。能够以任何你喜欢的方式对操作符进行排序,真的打开了各种可能性的世界。这个答案帮助我意识到我可以在
$project
之后
$match
,这样我就可以在
$project
之后过滤我的字段。