猫鼬有条件地填充子文档

Posted

技术标签:

【中文标题】猫鼬有条件地填充子文档【英文标题】:mongoose conditional populate on subdocument 【发布时间】:2015-11-27 00:57:27 【问题描述】:

我的架构如下所示:

var UserSchema = new Schema(
  name              :  type: String, required: true ,
  email             :  type: String, lowercase: true ,
  fences            : [type: Schema.Types.ObjectId, ref: 'Group']
);

var GroupMemberSchema = new Schema( 
    user  :  type: Schema.Types.ObjectId, ref: 'User', required: true ,
  status  :  type: String, default : 'Invited' 
);

var GroupSchema = new Schema(
  name          : String,
  members       : [GroupMemberSchema],
  type          : String
);

Group 和 User 被导出为它们自己的集合。我有一个端点 api/users/me 我想在其中获取我的用户和我的所有组。在组内,我想在我的成员中填充用户。我可以使用此代码正常工作:

User.findOne(
      _id: userId
    )
    .populate('groups')
    .exec(function(err, user)  
      if (err) return next(err);
      if (!user) return res.json(401);

      var options = 
        path: 'groups.members.user',
        model: 'User'
      ;

      User.populate(user, options, function (err, user) 
        return res.json(user);
      );

    );

但是,如果组类型 == 'Special',我不想填充每个成员的关联用户。我将如何设置选项?

【问题讨论】:

【参考方案1】:

您可以在填充中使用“匹配”属性。

类似这样的:

User.findOne(
      _id: userId
    )
    .populate('groups')
    .exec(function(err, user)  
      if (err) return next(err);
      if (!user) return res.json(401);

      var options = 
        path: 'groups.members.user',
        model: 'User',
        match:  'group.type':  $ne: 'Special'  
      ;

      User.populate(user, options, function (err, user) 
        return res.json(user);
      );

    );

【讨论】:

【参考方案2】:

您正在填充子文档,但填充机制没有区别

只需选择类型为 !== 'Special' 的所有组并在过滤后的数组上运行填充

var options = 
  path: 'members.user',
  model: 'User'
;
var specialGroups = _.filter(user.groups, function(group)return group.type !== 'Special')

User.populate(specialGroups, options, function (err, user) 
  return res.json(user);
);

因此,在 groups 数组中,您填充了一些文档而未填充了一些文档。很奇怪,但是你可以使用 specialGroups 来代替 user.groups

【讨论】:

以上是关于猫鼬有条件地填充子文档的主要内容,如果未能解决你的问题,请参考以下文章

如何通过填充字段在猫鼬中查找文档?

猫鼬填充如何在同一对象而不是子文档中填充文档

如何在子文档中填充模型实例数组? MongoDB猫鼬

如何在猫鼬中填充另一个模型的子文档?

构建我的猫鼬模式的最佳方式:嵌入式数组、填充、子文档?

如何填充一组子`ref`ed文档猫鼬?