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

18

Я прихожу из 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}
});

Спасибо!

    
задан nwkeeley 16.01.2013 в 17:28
источник

2 ответа

43

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

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

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);
     })
    
ответ дан Michael Yin 16.01.2013 в 22:05
  • Очень интересно я буду применять это и посмотреть, как он работает, но второй, который вы упомянули, выглядит именно так, что мне нужно. –  nwkeeley 18.01.2013 в 23:28
  • Хорошо, я только что обновил свои ссылки на схемы и использовал эти населенные пункты отлично! –  nwkeeley 18.01.2013 в 23:57
  • Это потрясающе, но вы можете изменить результат возврата от exec, скажем, если я не хочу включать поле группы. –  Bruce 29.06.2015 в 04:49
  • Я немного не понимаю, как он знает, как «присоединиться» к тому, где. Для чего это свойство ref? Находит ли населенность мангуста ProjectSchema на основе ref, являющегося проектом, и означает ли это, что необходимо соблюдать строгую конвенцию об именах? –  Randy Hall 20.11.2015 в 20:32
2

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

MongoDB и «присоединяется»

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

  • Встраивание: вы вставляете информацию в один документ, который в реляционной БД должен быть распределен между различными таблицами.
  • Объединение информации на стороне клиента. Когда вам нужно использовать информацию из нескольких мест, вы запрашиваете много раз, а затем складываете фрагменты в своем клиенте.
ответ дан joscas 16.01.2013 в 20:57
  • Да, это отличный пост, объясняющий это ... теперь просто время для реализации! –  nwkeeley 18.01.2013 в 23:27