猫鼬模式/查询



我正在尝试在我的应用程序中构建一个朋友组件。

我对来自MySQL背景的Mongo/Mongoose仍然相当陌生。

我在这里要做的是访问用户的个人资料,以及他们的个人资料是否有私人设置,然后检查该用户是否拥有以朋友身份访问其页面的用户。

假设我有一个用户架构

var UserSchema = new Schema({
username      : String,
friends       : [{ id: { type: Schema.Types.ObjectId, ref: 'User'}, status: Number }],
});
var User         = mongoose.model('User', UserSchema);
User.findOne({username: 'req.params.username', 'friends.id': req.session.user.id}, function (err, user)
if(user){
user.isFriend = true;
}
});

我觉得这只查找任何带有 req.params.username 的用户名或任何带有 req.session.user.id 的 id,而不是找到具有此用户名的用户并查看 req.session.user.id 是否在该用户的朋友数组中。

有没有更好的方法

?在MySQL中,它类似于从用户名="某物"的"用户"中进行选择,然后检查该结果以查看该结果的好友数据中是否存在id。

查询始终按_id: username返回文档(如果存在)。您需要做的是获取friends字段并遍历它以查看id是否存在。或者,使用聚合的简单查询也可以使用。

User.aggregate([{$match: {_id: req.params.username,
'friends.id': req.session.user.id}},
{$project: {friends: {$filter: {
input: '$friends',
as: 'fr', 
cond: {$eq: ['$$fr.id', req.session.user.id]}
}
}
}
}
]);

上面应该返回一个带有一个项目的数组,并且该项目中包含friends数组,如果给定的数组存在于friends列表中,则数组仅包含一个id

注意:req.session.user.id应为Schema.Types.ObjectId类型。

最新更新