假设我的模型是用户和项目。每个用户都可以分配到许多项目,每个项目可以分配许多用户。这是典型的多对多关系,可以存储为(source):
# The user document.
{
"_id" : ObjectId("4d3ed089fb60ab534684b7e9"),
"project_ids" : [ ObjectId("4d3ed089fb60ab534684b7f2") ]
}
# The project document.
{
"_id" : ObjectId("4d3ed089fb60ab534684b7f2"),
"user_ids" : [ ObjectId("4d3ed089fb60ab534684b7e9") ]
}
问题是,我想分配更多描述这种关系的数据,例如:用户在项目中的角色(管理员,经理等)。在RDBMS中,我只需要在连接表中添加一个额外的列。在MongoDB中,我真的不知道如何解决这个问题。
我应该在用户还是项目中创建其他嵌入式文档?我在考虑这样的事情:
# The project document.
{
"_id" : ObjectId("4d3ed089fb60ab534684b7f2"),
"assigned_users" : [
{ user_id: ObjectId("4d3ed089fb60ab534684b7e9"), role: "admin" },
...
]
}
但是我觉得获取所有用户项目的查询会变得非常复杂,对吗?
我正在使用Mongoid,但对任何一般解决方案都会感激(然后我会弄清楚如何将它映射到Mongoid;) 另外,我无法将数据库更改为RDBMS。
答案 0 :(得分:3)
如何在User
集合中存储有关Users
的所有内容?
{
"_id": ObjectID("..."),
"projects": [
{ "role": "admin", "project_id": ObjectId("...") },
{ "role": "manager", "project_id": ObjectId("...") }
]
}
将在Users
集合上进行查询。
// find all admins on a project, for example
db.Users.find( { "projects" :
{ "role" : "admin", "project_id": ObjectId("...") } })