Запрос Mongoose/mongoDB... но я пришел из sql-фона

Я прихожу из sql-фона, поэтому запись запросов в sql, где я соединяю таблицы, довольно проста, но я думаю, что мне не хватает этого в mongoose/mongodb

В основном я знаю Subscriber_ID (который сопоставляется с документом в пользовательской коллекции)

Я хочу вытащить группу проектов со всеми проектами, к которым принадлежит пользователь, поэтому, если бы я написал это в pseduo sql, это было бы как

Select 
  ProjectGroup.title, 
  Project.Title 
FROM 
  ProjectGroup, 
  Project, 
  User 
WHERE 
  User.id = req.body.subscriber_id 
  AND Project.subscriber_id = User.id 
  AND  ProjectGroup.project_id = Project.id

Должен быть способ сделать похожие соединения в mongoose/mongodb, потому что тип является правильной привязкой к схеме?

Мои схемы.....

Схема проектной группы

var ProjectGroupSchema = new Schema({
    title             : String
  , projects          : [ { type: Schema.Types.ObjectId, ref: 'Project' } ]
});

Схема проекта

var ProjectSchema = new Schema({
    title         : {type : String, default : '', required : true}
  , subscribers   : [{ type: Schema.Types.ObjectId, ref: 'User' }]
});

Пользовательская схема

var UserSchema = new Schema({
    first_name    : {type: String, required: true}
  , last_name     : {type: String, required: true}
});

Спасибо!

Ответ 1

Вы всего в одном шаге!

Схема проектной группы:

var ProjectGroupSchema = new Schema({
    title             : String
});

Схема проекта:

var ProjectSchema = new Schema({
    title         : {type : String, default : '', required : true},
    group         : {type: Schema.Types.ObjectId, ref: 'ProjectGroup' },
    _users    : [{type: Schema.Types.ObjectId, ref: 'User' }]
});

Пользовательская схема:

var UserSchema = new Schema({
    first_name    : {type: String, required: true},
    last_name     : {type: String, required: true},
    subscribing   : [{type: Schema.Types.ObjectId, ref: 'Project' }]
});

Затем вы можете сделать следующее:

user.findById(req.userId)
     .populate('subscribing')
     .exec(function(err, user){
          console.log(user.subscribing);
     })

Или:

project.find({
        subscriber : req.userId
      })
     .populate('subscriber')
     .populate('group')
     .exec(function(err, projects){
          console.log(projects);
     })

Ответ 2

В Mongodb нет объединений. Этот вопрос, на мой взгляд, является хорошей ссылкой:

MongoDB и "присоединяется"

Подводя итог, должны быть приняты различные стратегии с mongodb для проблем, которые будут решаться с помощью объединений в реляционных БД. Я бы сказал, что в основном вы делаете одну из этих двух вещей:

  • Встраивание: вы вставляете информацию в один документ, который в реляционной БД должен быть распределен между различными таблицами.
  • Объединение информации на стороне клиента. Когда вам нужно использовать информацию из нескольких мест, вы запрашиваете много раз, а затем складываете фрагменты в своем клиенте.