led*_*edy 4 mongodb aggregation-framework
拥有一个包含大约 100GB 数据和 $match 表达式中每个字段的 mongodb,我有一个索引(单字段索引)。
现在我尝试了aggregate()并将$project写为管道中的第一部分,$match在其后面。
聚合运行并返回正确的结果,但需要几个小时!这是否真的只处理过滤后的($match)数据,还是 mongo 聚合所有数据并随后进行过滤?
在我的测试用例中,$match 过滤了大约 150MB(而不是 100GB 的完整数据大小)。
不小心,我改变了顺序,在管道定义中将 $match 写在 $project 之前。这样,几秒钟之内就完成了。
mongodb通常什么时候减少输入数据并且它也处理$match中字段的索引?
正如您所注意到的,管道运算符的顺序非常重要,尤其是在处理大型集合时。如果操作不当,您可能会耗尽内存,更不用说该过程需要很长时间了。如文档中所述:
以下管道运算符在出现在管道开头时会利用索引:
Run Code Online (Sandbox Code Playgroud)$match $sort $limit $skip.
所以只要$match出现在前面你的索引就可以使用。文档中也注明了
MongoDB 聚合管道将 MongoDB 文档从一个管道运算符流式传输到下一个管道运算符以处理文档。管道运算符可以在管道中重复。
这意味着$project如果前面带有 . 则您只能看到整个集合的一小部分$match。
| 归档时间: |
|
| 查看次数: |
5485 次 |
| 最近记录: |