2011-03-27 118 views
2

什麼是返回所有嵌入文檔的最有效方式?mongoid:返回所有嵌入文檔

說一個用戶有很多地址嵌入...在ActiveRecord我可以通過Address.count得到他們的數量。這是什麼嵌入式文件/ mongo版本?

當它的2級或更多關卡深度如何? Product> Pressing> Variations ...我如何能夠統計所有書籍中所有作者的所有章節?比如說,Ruby會怎麼樣呢?

Product has_many Pressings 
Pressing has_many Variations 

Product 
    def self.pressings 
    all.collect { |p| p.pressings }.flatten 
    end 
    def self.variations 
    self.pressings.collect { |p| p.variations }.flatten 
    end 
end 

回答

4

正如@maga所說,Map/Reduce對於實時聚合來說太慢了,並且存儲計數字段是最好的方法。

另一種選擇是將整個文檔(或特定字段)返回到您的應用程序並在那裏解析。這可能是最好的,當你不知道有多少嵌套級別將存在。

儘管有些人可能會這麼想,但這樣做絕對沒有壞處。您的數據庫服務器將很樂意快速返回此文檔,並允許您的應用程序處理後期處理。

就可擴展性而言,這種方法意味着您將擴展您的應用服務器(通常更便宜),而不是數據庫服務器(通常更昂貴)。

+0

我更新了一些Ruby代碼的帖子。通過這種方式進行映射/減少會有好處嗎? – brewster 2011-03-28 02:23:58

+0

如果你需要實時數據,我不認爲有很多(如果有的話)利用m/r做到這一點。 Map/Reduce非常適合離線處理數據,這些數據將存儲在別處供以後訪問。如果你可以使用稍微過時的數據,一個m/r作業就足夠了。 – 2011-03-28 02:51:43

2

Map/reduce在MongoDB中對數據和聚合操作的批處理非常有用。

5

通常這是通過aggregation功能(包括map/reduce對於更具體的情況)完成的,但它們相對較慢並且不適合在重度應用中實時使用。所以,如果性能問題,我建議額外的數字字段,當發生變化時通過atomic operations進行更新,並且不時通過聚合函數進行修改。