一尘不染

猫鼬“反向”填充,即基于子模式中定义的引用填充父对象

node.js

让我们借用来自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查询项目。

谢谢!


阅读 232

收藏
2020-07-07

共1个答案

一尘不染

您可以通过使用聚合函数来实现。首先通过“ 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);
    });

});
2020-07-07