mongoose'颠倒'的人口,即基于子模式中定义的引用填充父对象

让我们借由修改如下的吓人的 例子来举例 :

项目组架构:

var ProjectGroupSchema = new Schema({ projectGroupId : String, title : String }); 

项目模式:

 var ProjectSchema = new Schema({ title : {type : String, default : '', required : true}, group : {type: String, ref: 'ProjectGroup' }, subscribers : [{type: String, ref: 'User' }] }); 

用户架构:

 var UserSchema = new Schema({ userId : {type: String, require: true}, firstName : {type: String, required: true}, lastName : {type: String, required: true}, }); 

那我可以做下面的人口:

 project.findById(req.projectId}) .populate('subscribers') .populate('group') .exec(function(err, project){ console.log(project); }); 

请注意,参考字段不是对象ID。

在这个例子中,项目模式具有对项目组和订户的引用字段,这使上述人口成为可能。

如果我想获得一个ProjectGroup对象,该对象包含该组下的所有项目,并且每个项目都包含其订户?

我会说我正在寻找一个“颠倒”人口,即填充基于子模式中定义的引用的父对象。 目前,我使用asynchronous查询ProjectGroup,然后根据projectGroupId查询项目。

谢谢!

你可以通过使用聚合函数来实现这一点。 先按“projectGroup”项目组项目,然后填充结果。

 project.aggregate([ {$group: {_id: "$group", projects: {$push: "$$ROOT"}}} ], function(err,results) { user.populate( results, { "path": "projects.subscribers" }, function(err,results) { if (err) console.log(err); res.send(results); }); });