在$ match表达式中有一个大约100GB数据的mongodb和每个字段,我有一个索引(单字段索引)。
现在我尝试了aggregate()并将$ project作为管道中的第一部分,$ match匹配。
聚合运行并返回正确的结果,但需要几个小时!这是否真的只处理过滤后的($ match)数据,或者mongo是否在整个数据范围内聚合并在之后进行过滤?
在我的测试用例中,$ match过滤器大约150MB(而不是100GB的完整数据大小)。
偶然地,我改变了顺序并在管道定义中的$ project之前写了$ match。这样,它就在几秒钟内完成。
mongodb通常何时减少输入数据,是否也处理$ match中字段的索引?
答案 0 :(得分:2)
正如您所注意到的,管道运营商的顺序非常重要,尤其是在处理大型集合时。如果操作不正确,您可能会耗尽内存,更不用说这个过程需要很长时间。如上所述in the docs:
以下管道运营商在利用索引时会利用它们 发生在管道的开头:
$match $sort $limit $skip.
只要$match
出现在前面,就可以使用索引。还注意到in the docs
MongoDB聚合管道从一个流传输MongoDB文档 管道操作员到下一个处理文件。管道 操作员可以在管道中重复。
这意味着,如果$project
前面有$match
,则{{1}}只会看到整个集合的一小部分。