2013-02-20 67 views
2

前$比賽有一個MongoDB的周圍數據的100GB和每個在$匹配表達式場,我有一個指數(單場指數)。

現在我試圖彙總(),並在這背後的管道,$匹配寫道$項目的第一部分。

聚合運行並返回正確的結果,但需要數小時!這是真的只處理過濾後的($匹配)數據,還是mongo會聚合全部數據並過濾?

在我的測試情況下,150MB左右比賽$過濾器(而非100GB的全數據的大小)。

無意間,我改變了順序,並在管道定義$項目之前寫的$匹配。這樣,它在幾秒鐘內完成。

什麼時候MongoDB中通常會降低輸入的數據,但它也應對在$匹配字段中的指數?

回答

2

正如您已經注意到的,管道操作員的順序非常重要,特別是在處理大型收集時。如果做得不正確,你可能會耗盡內存,更不用說花費很長時間的過程。如前所述in the docs

下,當他們 在管道的開始發生管道運營商採取指數的優勢:

$match 
$sort 
$limit 
$skip. 

所以只要$match出現前你索引可以使用。還指出in the docs

MongoDB的聚合管道流MongoDB的文件從一個 管道運營商下一個要處理的文件。管道 操作員可以在管道中重複。

這意味着,你$project只能看到整個集合的一小部分,如果它是由前$match

+0

我在找到令人震驚的聚合框架。能夠以任何你喜歡的方式訂購操作員真的打開了世界的可能性。這個答案幫助我意識到'$ project'後可以'$ match',這樣我就可以過濾'$ project'後的字段。 – Rohmer 2016-10-16 21:34:20