我的数据库中有两个集合 -
> 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中执行密钥存储和访问 应用程序代码中的自定义方式。
请帮我搞这个参考。
答案 0 :(得分:2)
在其他模型中嵌入的模型不能包含除嵌入之外的其他关系...对于您的案例activity
嵌入在monitor_symptom
中,它不能从其他文档中复制(你是谁?在user_activity
)。当你有这么复杂的结构时,最好在文档而不是嵌入之间使用refrenced关系。对于例如在user和user_activity,monitor_symptom和activity之间,您可以轻松地在activity和user_activity之间建立refrenced关系。