我的架构看起来像这样:
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
});
组和用户将作为自己的集合导出。我有一个端点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);
});
});
但是,如果群组类型=='特殊',我不想填充每位会员的相关用户。我如何选择这样做?
答案 0 :(得分:1)
您正在填充子文档,但填充机制没有区别
只需选择所有类型为!=='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);
});
所以在组内部数组中,您已填充了一些文档,而某些文档未填充。这很奇怪,但您可以使用specialGroups而不是user.groups
答案 1 :(得分:0)
您可以使用"匹配"填充内的财产。
这样的事情:
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);
});
});