mongoid:返回所有嵌入文档

问题描述:

什么是返回所有嵌入文档的最有效方式?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 

正如@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

Map/reduce在MongoDB中对数据和聚合操作的批处理非常有用。

通常这是通过aggregation功能(包括map/reduce对于更具体的情况)完成的,但它们相对较慢并且不适合在重度应用中实时使用。所以,如果性能问题,我建议额外的数字字段,当发生变化时通过atomic operations进行更新,并且不时通过聚合函数进行修改。