2010-07-07 67 views
11

我想弄清楚在Mongo中構建我的數據以模擬SQL中的簡單連接或子查詢的最佳方式。MongoDB - 模擬連接或子查詢

說我有經典的用戶和帖子的例子,用戶在一個集合和帖子在另一個。我想查找城市是「倫敦」的用戶的所有帖子。

我已經簡化的東西在這個問題上,我在現實世界中的場景存儲作爲帖子的用戶文檔中的一個陣列,因爲我有1000米的的「上崗」每用戶不斷將不會工作。

Mongos $ in操作符能幫助嗎? $可以處理10,000,000個條目的數組嗎?

回答

10

老實說,如果你不適合「文章」到「用戶」,那麼你有兩個選擇。

  1. 進行非標準化的帖子裏面一些用戶數據。然後你可以搜索一個集合。
  2. 做兩個查詢。 (一個找到用戶的其他發現帖子)

根據你的問題,你正在試圖做#2。

從理論上說,你可以建立用戶ID(或裁判)的列表,然後找到屬於用戶$in該陣列中的所有文章。但顯然這種方法是有限的。

能否美元處理10,000,000項的數組?

看,如果你打算到「查詢」您的文章爲所有用戶在一套10,000,000用戶您已經遠遠超出了「查詢」的階段。你說你自己,每個用戶有1000個帖子,所以你在討論一個查詢「用戶的帖子誰住在倫敦」返回100Ms的記錄。

100M記錄不是查詢,這是一個數據集!

如果您擔心打破$in命令,那麼我強烈建議您使用map/reduce。 Mongo Map/Reduce將爲您創建一個新的集合。您可以根據需要修剪或彙總此數據集。

2

我有類似的東西,但我的設置是面向「用戶」和「消息」。我所做的是爲用戶添加一個引用,有點像外鍵。我使用用戶集合中生成的「_id」並將其存儲爲「消息」中的關鍵字。對於用戶發送的每條消息,我將它保存到「消息」集合中。你應該閱讀dbrefs,我想這就是你要找的。

你將不得不運行多個查詢,但你應該在應用程序端做到這一點。

3

$ in可以處理100,000個條目。我從來沒有嘗試10,000,000條目,但查詢(查詢也是一個文檔)必須小於4mb(像每個文檔),因此10,0000,0000條目是不可能的。

爲什麼不在用戶集合中包含用戶及其城鎮?你可以索引這個城鎮,因爲你可以索引嵌入實體的屬性。您不必再模擬聯接,因爲您可以查詢嵌入式用戶城鎮上的帖子。

這意味着你必須更新帖子的時候,用戶的變化鎮但這並不經常發生。如果您爲Posts集合中的UserId編制索引,此更新將會很快。

+3

正如在最近的64位版本中,文檔限制已被顯着提高一樣。 (24MB) – 2012-08-20 17:11:15