【问题标题】:mongoid: return all embedded documentsmongoid:返回所有嵌入的文档
【发布时间】:2011-07-23 17:53:54
【问题描述】:

返回所有嵌入文档的最有效方法是什么?

假设用户嵌入了许多地址...在 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

【问题讨论】:

    标签: ruby mongodb mongoid


    【解决方案1】:

    正如@maga 所说,Map/Reduce 对于实时聚合来说太慢了,存储计数字段是最好的方法。

    另一种选择是将整个文档(或特定字段)返回到您的应用程序并在那里进行解析。当您不知道将存在多少嵌套级别时,这可能是最好的。

    尽管有些人可能会这么想,但这样做绝对没有坏处。您的数据库服务器将很乐意快速返回此文档并允许您的应用程序处理后处理。

    就可扩展性而言,这种方法意味着您将扩展应用程序服务器(通常更实惠),而不是数据库服务器(通常更昂贵)。

    【讨论】:

    • 我用一些 Ruby 代码更新了我的帖子。 map/reduce 比这样做有好处吗?
    • 如果您需要实时数据,我认为使用 m/r 执行此操作不会有很多(如果有的话)好处。 Map/reduce 非常适合离线处理将存储在其他地方供以后访问的数据。如果您可以使用稍微过时的数据,则 m/r 工作就足够了。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      MongoDB 中的Map/reduce 对于数据的批处理和聚合操​​作很有用。

      【讨论】:

        猜你喜欢
        • 2016-02-11
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多