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

Database design MongoDB(Mongoid)与附加数据(附加字段)的多对多关系,database-design,mongodb,mongoid,Database Design,Mongodb,Mongoid,假设我的模型是用户和项目。每个用户可以被分配到多个项目,每个项目可以分配多个用户。这是一个典型的多对多关系,可以存储为(): 问题是,我想分配更多描述这种关系的数据,例如用户在项目中的角色(管理员、经理等)。在RDBMS中,我只需向联接表添加一个额外的列。在MongoDB,我真的不知道该怎么做 我应该在用户或项目中创建其他嵌入文档吗?我在想这样的事情: # The project document. { "_id" : ObjectId("4d3ed089fb60ab534684b7f2")

假设我的模型是用户和项目。每个用户可以被分配到多个项目,每个项目可以分配多个用户。这是一个典型的多对多关系,可以存储为():

问题是,我想分配更多描述这种关系的数据,例如用户在项目中的角色(管理员、经理等)。在RDBMS中,我只需向联接表添加一个额外的列。在MongoDB,我真的不知道该怎么做

我应该在用户或项目中创建其他嵌入文档吗?我在想这样的事情:

# The project document.
{
  "_id" : ObjectId("4d3ed089fb60ab534684b7f2"),
  "assigned_users" : [
    { user_id: ObjectId("4d3ed089fb60ab534684b7e9"), role: "admin" },
    ...
  ]
}
但我想,获取所有用户项目的查询将变得相当复杂,对吗

我正在使用Mongoid,但如果有任何通用的解决方案,我将不胜感激(然后我将找出如何将其映射到Mongoid;)
此外,我无法将数据库更改为RDBMS。

如何将您所知道的有关
用户的所有信息存储在
用户
集合中

{
  "_id": ObjectID("..."),
  "projects": [
    { "role": "admin", "project_id": ObjectId("...") },
    { "role": "manager", "project_id": ObjectId("...") }
  ]
}
查询将在
用户
集合上进行

// find all admins on a project, for example
db.Users.find( { "projects" : 
                  { "role" : "admin", "project_id": ObjectId("...") } })

我最终采取了将指定用户放入项目的方法。你的例子让我意识到,尽管质疑并不困难。我可以通过
db.projects.find({“assigned\u users.user\u id”:userId})列出所有用户项目
@Juliusz Gonera,您是如何在Mongoid中实现反向映射的?如果一个用户可以参与多个项目,那么他们可能需要一个
project\u id
s数组,但Mongoid不知道如何为您维护该数组。@IsaacCambron,您必须创建一个user\u project(或project\u user)文档来保存relation@IsaacCambron,据我记忆所及,我没有做任何映射,我刚刚为返回用户项目的模型编写了一个方法:
Project.all(条件:{“collaborators.user\u id”=>self.id})
// find all admins on a project, for example
db.Users.find( { "projects" : 
                  { "role" : "admin", "project_id": ObjectId("...") } })