让我们借用来自Scaryguy的出色示例,并进行如下修改: 项目组架构:
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对象,该对象包含该组下的所有项目,并且每个项目都包含其订阅者,该怎么办?
我会说我正在寻找“反向”人群,即基于子架构中定义的引用填充父对象。目前,我先使用async来查询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); }); });