MongoDB(Mongoid)与其他数据(附加字段)的多对多关系

时间:2011-07-26 16:31:22

标签: database-design mongodb mongoid

假设我的模型是用户和项目。每个用户都可以分配到许多项目,每个项目可以分配许多用户。这是典型的多对多关系,可以存储为(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。

1 个答案:

答案 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("...") } })