猫鼬'逆转'填充,即基于子模式中定义的引用填充父对象

时间:2016-06-08 00:22:51

标签: node.js mongoose mongoose-populate

让我们从example借用优秀的scaryguy,修改如下:

项目组架构:

public class TestSort {
  public static void main(String args[]) {
    String init[] = {"B106", "D111", "A201", "B102"};
    List list = new ArrayList(Arrays.asList(init));
    System.out.println("Input: " + list);
    Collections.sort(list);
    System.out.println("Output: " + list);
  }
}

项目架构:

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},
});

请注意,引用字段不是对象ID。

在此示例中,项目架构具有项目组和订阅者的参考字段,这使得上述人口成为可能。

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

我说我正在寻找一个“颠倒过来的'填充,即基于子模式中定义的引用填充父对象。 目前我首先使用异步查询ProjectGroup,然后根据projectGroupId查询项目。

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用聚合函数来实现此目的。第一组项目由" 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);
    });

});

答案 1 :(得分:2)

如果要获取一个ProjectGroup对象,该对象包含该组下的所有项目。您可以使用Populate Virtuals。 (猫鼬版本> 4.5.0)

在架构文件中创建虚拟架构。

ProjectGroupSchema.virtual('projects', {
  ref: 'Project', // The model to use
  localField: 'projectGroupId', // Your local field, like a `FOREIGN KEY` in RDS
  foreignField: 'group', // Your foreign field which `localField` linked to. Like `REFERENCES` in RDS
  // If `justOne` is true, 'members' will be a single doc as opposed to
  // an array. `justOne` is false by default.
  justOne: false
});

并在以下查询:

ProjectGroup.find().populate('projects').exec(function(error, results) {
  /* `results.projects` is now an array of instances of `Project` */
});

如果看不到虚拟零件,请为模型设置{ toJSON: { virtuals: true } }

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