4

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

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

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

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

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

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

4

1 回答 1

5

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

以下管道运算符在管道开始时利用索引:

$match 
$sort 
$limit 
$skip.

因此,只要$match预先提出您的索引就可以使用。也在文档中注明

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

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

于 2013-02-20T18:52:45.507 回答