Mongoid:嵌入式文档之间的关系

时间:2013-11-12 06:40:16

标签: mongodb mongoid

我的数据库中有两个集合 -

> db.users.find().pretty()
        {
            "_id" : ObjectId("5281c15a617274166f150000"),
            "email" : "aerf@gmail.com",
            "nickname" : "Artem",
            "user_activities" : [
                {
                    "_id" : ObjectId("5281c19161727415d5000000"),
                    "activity_id" : ObjectId("5281c15a617274166f010000"),
                    ...
                },
                {
                    "_id" : ObjectId("5281c19161727415d6000000"),
                    "activity_id" : ObjectId("5281c15a617274166f020000"),
                    ...
                },
                       ...
            ]
        },
       ....

> db.monitor_symptoms.find().pretty()
    {
        "_id" : ObjectId("5281c15a617274166f000000"),
        "activities" : [
            {
                "_id" : ObjectId("5281c15a617274166f010000"),
                "name" : "ASW"
                        ...
                },
                {
                "_id" : ObjectId("5281c15a617274166f010000"),
                "name" : "BSW"
                        ...
                },
                ...
       ],
       ...
    },
    ...

我的应用程序中的以下模型支持此功能 -

class User
  include Mongoid::Document
  field :email, type: String, :default => ""
  field :nickname, type: String, :default => ""
  embeds_many :user_activities
end

class UserActivity
  include Mongoid::Document
  embedded_in :user
  has_to_many :activities, inverse_of: nil
end

class MonitorSymptom
  include Mongoid::Document
  embeds_many :activities
end

class Activity
  include Mongoid::Document
  field :name, type: String
  embedded_in :monitor_symptom
end

我接下来尝试 -

2.0.0p0 :090 >   user = User.first
 => #<User _id: 5281c15a617274166f150000, email: "aerf@gmail.com", nickname: "Artem"

2.0.0p0 :091 > user.user_activities.new(activity_id: "5281c15a617274166f010000")
 => #<UserActivity _id: 5281c15a617274166f150000, activity_id: "5281c15a617274166f010000"> 

2.0.0p0 :092 > user.save

我发现了一个错误:

  

Mongoid :: Errors :: MixedRelations:问题:引用(n)活动   来自UserActivity文档的文档通过关系关联   由于嵌入了Activity,因此不允许。总结:为了   从UserActivity正确访问(n)活动引用   需要浏览Activity的根文档。在一个简单的情况下   这将需要Mongoid为root存储额外的外键,   在更复杂的情况下,活动是多层次的深层关键   需要为层次结构中的每个父级存储。解析度:   考虑不嵌入Activity,或者在a中执行密钥存储和访问   应用程序代码中的自定义方式。

请帮我搞这个参考。

1 个答案:

答案 0 :(得分:2)

在其他模型中嵌入的模型不能包含除嵌入之外的其他关系...对于您的案例activity嵌入在monitor_symptom中,它不能从其他文档中复制(你是谁?在user_activity)。当你有这么复杂的结构时,最好在文档而不是嵌入之间使用refrenced关系。对于例如在user和user_activity,monitor_symptom和activity之间,您可以轻松地在activity和user_activity之间建立refrenced关系。