【问题标题】:MongoDB (Mongoid) many-to-many relationship with additional data (additional fields)MongoDB(Mongoid)与附加数据(附加字段)的多对多关系
【发布时间】:2011-10-13 14:07:09
【问题描述】:

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

【问题讨论】:

    标签: database-design mongodb mongoid


    【解决方案1】:

    将您所知道的关于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("...") } })
    

    【讨论】:

    • 我最终采取了将分配的用户放入项目中的方法。你的例子让我意识到查询并不困难。我可以通过db.projects.find({ "assigned_users.user_id": userId })列出所有用户项目。
    • @Juliusz Gonera,你是如何在 Mongoid 中实现逆映射的?如果用户可以参与多个项目,那么他们可能需要一组 project_ids,但 Mongoid 不知道如何为您维护它。
    • @IsaacCambron,您必须创建 user_project(或 project_user)文档以保持关系
    • @IsaacCambron,据我记得我没有做任何映射,我只是为返回用户项目的模型写了一个方法:Project.all(conditions: { "collaborators.user_id" => self.id })
    猜你喜欢
    • 2012-03-25
    • 2011-05-25
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2020-05-01
    相关资源
    最近更新 更多