2016-01-06 265 views
16

$lookup是MongoDB 3.2中的新增功能。它對同一數據庫中的未加註集合執行左外部聯接,以過濾「已加入」集合中的文檔進行處理。

要使用$lookupfrom集合不能被分割。

另一方面,分片是一種有用的水平縮放方法。

一起使用它們的最佳做法是什麼?

+0

$ lookup階段需要在數據庫的主分片上運行。由於「from」集合也不分片,因此它位於同一臺服務器上,並且可以在本地執行連接。你應該避免連接不同的機器。這是NoSQL ;-)我可以想象沒有好的解決方案。你想在應用程序中迭代結果還是想存儲它?在第一種情況下,也許你必須在每個文檔的循環中查找操作。在第二種情況下,您可以使用MapReduce:http://tebros.com/2011/07/using-mongodb-mapreduce-to-join-2-collections/ – yoooshi

回答

14

正如您引用的文檔所指出的,您不能在分片集合上使用$lookup。所以最佳實踐解決方法是在獨立查詢中自己執行查找。

  1. 執行您的aggregate查詢。
  2. 將查詢結果中的「localField」值拉到數組中,可能使用Array#map
  3. 使用類似{foreignField: {$in: localFieldArray}}
  4. 的查詢對「from」集合執行find查詢將您的結果合併爲任何您需要的格式。

不要讓$lookup限制阻止您從需要擴展性的分片集合中自行執行查找功能。

+0

因此,目前'$ lookup'是相當有限的? –

+1

我不會那麼遠;它仍然是一個強大的工具,因爲能夠從服務器端提取引用數據的能力仍然非常有用。但是,無法從分片收集中提取數據是一個關鍵限制。 – JohnnyHK