Отношения MongoDB/Mongoose «многие ко многим» — пользователь, проект и роль

Наш проект имеет следующие требования:

  1. Пользователь может участвовать в нескольких проектах
  2. У проекта может быть несколько пользователей.
  3. Пользователь может быть либо владельцем, либо администратором, либо наблюдателем проекта.
  4. Очевидно, что у проекта может быть только один владелец.
  5. У проекта может быть несколько администраторов или зрителей.
  6. У каждого пользователя есть домашний проект/проект по умолчанию.

Итак, я создал следующие схемы. Но я не могу использовать заполнение, и я нахожу добавление/обновление/удаление большого количества боли. Также, когда я запрашиваю проекты, я хочу показать идентификатор электронной почты пользователей, а не objectId, но не хочу использовать электронную почту в качестве ссылки, поскольку пользователь может изменить свою электронную почту. Пожалуйста, помогите мне с лучшим дизайном, учитывая наиболее популярные операции на схеме.

  1. Пользователь может создать проект
  2. Добавить людей в проект
  3. Просмотреть все его проекты и участников
  4. Изменить роль кого-либо в проекте
  5. Удалить кого-либо из проекта
  6. Просмотр проектов, владельцев и участников (электронные письма, а не идентификаторы объектов) в соответствии с их правами

Следующие рабочие схемы представлены в отдельных файлах user.js и project.js с обязательным экспортом моделей.

    var userSchema = mongoose.Schema({
      username: {type:String},
      password: String,
      email: {type:String, required:true, unique: true, index: true},
      createdAt: { type: Date, default: Date.now },
      firstName: String,
      lastName: String,
      home_project: {type:Schema.Types.ObjectId, ref:Project},
      owner: [{type:Schema.Types.ObjectId, ref:Project}],
      admin: [{type:Schema.Types.ObjectId, ref:Project}],
      viewer: [{type:Schema.Types.ObjectId, ref:Project}]
   });

    var projectSchema = mongoose.Schema({
      projectName: {type:String, required:true, unique: true, index: true},
      createdAt: { type: Date, default: Date.now },
      owner: {type:String, ref:User},
      admin: [{type:String, ref:User}],
      viewer: [{type:String, ref:User}]
   });

person Arnab Naha    schedule 30.05.2017    source источник
comment
Этот ответ может быть полезен. Я обычно выбираю вариант 1 или 2.   -  person Mikey    schedule 30.05.2017
comment
Но как мне справиться с несколькими ролями... это означает, что в более поздний момент времени может быть несколько ролей, кроме администратора, владельца, зрителя и т. д.   -  person Arnab Naha    schedule 30.05.2017