【问题标题】:MongoDB Embedded Documents / Documents with RailsMongoDB 嵌入式文档/带有 Rails 的文档
【发布时间】:2011-02-15 05:49:05
【问题描述】:

我最近通过使用 MongoMapper gem 开始在 Rails 上使用 MongoDB。我想知道是否有某种方法可以让类/对象/集合既是文档又是嵌入式文档。我希望同一个实体既可以包含/嵌入到其他文档中,也可以作为对象单独存在。

这可能吗?我是否以错误的方式解决这个问题?任何讨论/建议将不胜感激,因为现在网络上的资源似乎很少。

【问题讨论】:

  • 一般的答案是否定的,但我认为您可能以错误的方式处理问题。你能准确地说出你想要做什么吗?
  • 当然,我有两个实体:企业和个人。我希望企业将人员作为嵌入式文档。但是,我希望人们成为他们自己的文档,因为他们也有关联的实体。他们都有自己的展示页面——并且是独立的实体。但出于效率问题,我希望人们能够存储为企业的嵌入式文档。我知道这可能需要存在同一实体的两个“副本”。我打算只写一个 after_save 回调来更新人们的相关引用。欢迎任何想法。
  • 在每个企业中存储对 People 对象的引用数组可能最容易。
  • 这在严格意义上是不可能的,因为您最终会将关联与嵌入式关联混为一谈,这可能是您不想要的。您可以复制引用,以便 Business has_many :peoplehas_many :embedded_people 或其他内容,但您可以让它们保持同步。您是否可能过早地进行了优化?

标签: ruby-on-rails mongodb mongomapper nosql


【解决方案1】:

我有一个非常相似的用例,解决方案是(使用您的实体名称):

  • 与 People 的合集
  • belongs_to_related :person 的嵌入式模型 BusinessPerson
  • embeds_many :busiess_people 的企业合集

这背后的想法是,我在 BusinessPerson 中有额外的字段,如果 Person 还经营不同的业务,这些字段可能不适用。假设在该业务中的角色、电子邮件地址或它的份额。

不,你可能会说让一个人做生意可能看起来很难,但事实并非如此:

class Person
   def businesses
     Business.where('business_people._id' => self.id)
   end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多