我正在尝试在我的应用程序中构建一个朋友组件。
我对来自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
类型。