MongoDB/Mongoose 多对多关系 - 用户、项目和角色

Arn*_*aha 6 database-design mongoose mongodb relationships mongoose-schema

我们的项目有以下要求-

  1. 用户可以是多个项目的一部分
  2. 一个项目可以有多个用户。
  3. 用户可以是项目的所有者或管理员或查看者。
  4. 显然,一个项目只能有一个所有者。
  5. 一个项目可以有多个管理员或查看者。
  6. 每个用户都有一个家庭/默认项目。

所以我创建了以下模式 - 但我无法使用 populate 并且我发现添加/更新/删除很多痛苦。此外,当我查询项目时,我想显示用户的电子邮件 ID,而不是 objectId,但不想使用电子邮件作为参考,因为用户可以更改他们的电子邮件。考虑到模式上最流行的操作,请帮助我进行更好的设计-

  1. 用户可以创建项目
  2. 将人员添加到项目
  3. 查看他的所有项目和成员
  4. 更改项目中某人的角色
  5. 从项目中删除某人
  6. 根据他们的权利查看项目和所有者和成员(电子邮件不是对象 ID)

以下工作模式存在于单独的文件 user.js 和 project.js 中,需要导出模型。

    var userSchema = mongoose.Schema({
      用户名:{类型:字符串},
      密码:字符串,
      电子邮件:{type:String, required:true, unique: true, index: true},
      createdAt: { type: Date, 默认: Date.now },
      名字:字符串,
      姓氏:字符串,
      home_project: {type:Schema.Types.ObjectId, ref:Project},
      所有者:[{type:Schema.Types.ObjectId, ref:Project}],
      管理员:[{type:Schema.Types.ObjectId, ref:Project}],
      查看器:[{type:Schema.Types.ObjectId, ref:Project}]
   });

    var projectSchema = mongoose.Schema({
      项目名称:{type:String, required:true, unique: true, index: true},
      createdAt: { type: Date, 默认: Date.now },
      所有者:{type:String, ref:User},
      管理员:[{type:String, ref:User}],
      查看器:[{type:String, ref:User}]
   });