2016-03-02 2 views
3

Я искал высоко и низко, но не могу понять, как сформировать следующий запрос заселить, первый здесь мои модели:Mongoose заполнить несколько вложенных документов

const CourseSchema = new Schema({ 
    classes: [{ type: Schema.Types.ObjectId, ref: 'Classroom' }] 
}); 

const ClassSchema = new Schema({ 
    location: { type: mongoose.Schema.Types.ObjectId, ref: 'Location' }, 
    instructors: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }], 
}); 

У меня есть конечная точка, которая получает один конечно, но я хочу заполнить поле classes И поля location и instructors в classes. Прямо сейчас, я могу либо заполнить поле инструкторов в classes, либо location, но я не могу одновременно заполнить их оба. Это то, что я имею сейчас:

Course 
     .findById(req.params.courseId) 
     .populate({ 
      path: 'classes', 
      populate: { 
       path: 'instructors', 
       model: 'User' 
      } 
     }) 

Как можно также заполнить location поле в classes?

Спасибо.

+0

использовать этот плагин https://www.npmjs.com/package/mongoose-deep-populate – styopdev

+0

Интересно, если это работает: '.populate ({путь: 'классы', заполнить: { путь: «место инструкторов»}}) '. – robertklep

+0

@robertklep, я проверяю ваш код, только «location» заполняется правильно. однако, «инструкторы» пустые, они не заполнены ... – zangw

ответ

4

Пожалуйста, попробуйте это под мангустов v4, вот одна хорошая ссылка про Population

Course 
     .findById(req.params.courseId) 
     .populate({ 
      path: 'classes', 
      model: 'Classroom', 
      populate: { 
       path: 'instructors', 
       model: 'User'   
      } 
     }) 
     .exec(function(err, cour) { 
      if (err) 
       console.log(err); 
      else { 
       Course.populate(cour, 
        { 
         path: 'classes.location', 
         model: 'Location', 
        }, function(err, c1) { 
         if (err) 
          console.log(err); 
         else 
          console.log(util.inspect(c1, { showHidden: true, depth: null }));      
        }) 
      } 
     }) 
+0

Использование плагина с глубоким населением работает, но я попробовал ваш ответ, и он заполняет поле инструкторов, поле местоположения возвращается только как идентификатор. – Alistair

+0

, который работает! Будет иметь в виду в следующий раз. – Alistair

+0

работает как шарм – Anditthas

22

Интерес альтернативой является передать массив в вложен заселить.

Course 
    .findById(req.params.courseId) 
    .populate({ 
     path: 'classes', 
     model: 'Classroom', 
     populate: [{ 
      path: 'instructors', 
      model: 'User' 
     }, 
     { 
      path: 'location', 
      model: 'Location' 
     }] 
    }) 
+0

Что делать, если внутри этого массива населений нам нужно будет добавить еще одну населенность. Это возможно? –

+0

Да, просто следуйте той же структуре ... – Fucazu

+0

Уже успел, что :) Ваш ответ сэкономит большую часть моего времени. –

0
Try the below code  


getAllByQuery: function (query, callback) { 
    this 
     .find(query, {campaignId: 1}) 
     .populate({path: 'campaignId', 
     model: 'campaign', 
     select: { 
      'campaignDetail': 0, 
      'area': 0, 
     }, 
     populate: [{ 
      path: 'ad_Id', 
      model: 'Ad', 
      select: { 'Level': 1} 
     }, 
     { 
      path: 'categories', 
      model: 'Category', 
      select: { '_id': 0} 
     }] 
     }) 
     .exec(callback); 
    } 
Смежные вопросы