2016-03-02 118 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); 
    }