2016-03-02 104 views
3

我已經搜查高和低,但無法弄清楚如何形成下面填入查詢時,先在這裏是我的模型:貓鼬填充多重嵌套文件

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字段和locationinstructors字段classes。現在,我可以在classeslocation填充教師字段,但我無法同時填充它們兩個。這就是我現在:

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

如何我也填充在classeslocation場?

謝謝。

+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

使用深度填充插件作品,但我試過你的答案,它只填充指導員字段,位置字段只返回作爲ID。 – 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); 
    }