用mongoose填充嵌套数组

如何在示例文档中填充“组件”:

{ "__v": 1, "_id": "5252875356f64d6d28000001", "pages": [ { "__v": 1, "_id": "5252875a56f64d6d28000002", "page": { "components": [ "525287a01877a68528000001" ] } } ], "author": "Book Author", "title": "Book Title" } 

这是我的JS,我通过Mongoose获取文档:

  Project.findById(id).populate('pages').exec(function(err, project) { res.json(project); }); 

mongoose4.5支持这个

 Project.find(query) .populate({ path: 'pages', populate: { path: 'components', model: 'Component' } }) .exec(function(err, docs) {}); 

这对我行得通:

  Project.find(query) .lean() .populate({ path: 'pages' }) .exec(function(err, docs) { var options = { path: 'pages.components', model: 'Component' }; if (err) return res.json(500); Project.populate(docs, options, function (err, projects) { res.json(projects); }); }); 

文档: Model.populate

正如其他人所指出的, Mongoose 4支持这一点。 需要注意的是,如果需要的话,您也可以深入到比一个层次更深的层次,尽pipe在文档中没有注意到:

 Project.findOne({name: req.query.name}) .populate({ path: 'threads', populate: { path: 'messages' , model: 'Message' , populate: { path: 'user' , model: 'User' } } }) 

我发现这非常有用的创build一个feathersjs之前挂钩填充2 ref水平深的关系。 mongoose模型简单地有

 tables = new Schema({ .. tableTypesB: { type: Schema.Types.ObjectId, ref: 'tableTypesB' }, .. } tableTypesB = new Schema({ .. tableType: { type: Schema.Types.ObjectId, ref: 'tableTypes' }, .. } 

然后在hook之前:

 module.exports = function(options = {}) { return function populateTables(hook) { hook.params.query.$populate = { path: 'tableTypesB', populate: { path: 'tableType' } } return Promise.resolve(hook) } } 

与我试图实现这一点的一些其他方法相比,这非常简单。

删除文档参考

 if (err) { return res.json(500); } Project.populate(docs, options, function (err, projects) { res.json(projects); }); 

这对我有效。

 if (err) { return res.json(500); } Project.populate(options, function (err, projects) { res.json(projects); });