通过Mongoid / MongoDB建模多对多:

我对Mongoid / MongoDB比较新,我对如何建立特定的多对多关系有疑问。

我有一个User模型和一个Project模型。 用户可以属于许多项目,每个项目成员资格包括一个角色(例如“管理员”,“编辑者”或“查看者”)。 如果我使用ActiveRecord,那么我将使用has_many :throughUserProject之间建立多对多关联,然后我会在连接表中放置一个角色字段。

在MongoDB中为这个场景建模的好方法是什么?如何使用Mongoid声明该模型? 下面的示例似乎是一个很好的模型,但我不知道如何优雅地声明User和嵌入式ProjectMembership与Mongoid之间的关系关联。

提前致谢!

 db.projects.insert( { "name" : "Test project", "memberships" : [ { "user_id" : ObjectId("4d730fcfcedc351d67000002"), "role" : "administrator" }, { "role" : "editor", "user_id" : ObjectId("4d731fe3cedc351fa7000002") } ] } ) db.projects.ensureIndex({"memberships.user_id": 1}) 

建模好的Mongodb架构实际上取决于您访问数据的方式。 在您描述的情况下,您将索引您的memberships.user_id键,这似乎没问题。 但是,随着您添加查看者,编辑者和管理员,您的文档大小将会增加。 此外,您的架构将使查询很难像:

查询项目,其中user_id xxx是编辑器:

同样,您可能不需要查询这样的项目,因此您的架构看起来很好。 但是如果你需要通过user_id和角色查询你的项目,我建议你创建一个’project_membership’集合:

 db.project_memberships.insert( { "project_id" : ObjectId("4d730fcfcedc351d67000032"), "editors" : [ ObjectId("4d730fcfcedc351d67000002"), ObjectId("4d730fcfcedc351d67000004") ], "viewers" : [ ObjectId("4d730fcfcedc351d67000002"), ObjectId("4d730fcfcedc351d67000004"), ObjectId("4d730fcfcedc351d67000001"), ObjectId("4d730fcfcedc351d67000005") ], "administrator" : [ ObjectId("4d730fcfcedc351d67000011"), ObjectId("4d730fcfcedc351d67000012") ] } ) db.project_memberships.ensureIndex({"editors": 1}) db.project_memberships.ensureIndex({"viewers": 1}) db.project_memberships.ensureIndex({"administrator": 1}) 

甚至更容易……在项目架构上添加索引:

 db.projects.ensureIndex({"memberships.role": 1})