我正在尝试在我的应用中构建一个朋友组件。
我仍然是来自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中,它会像'users'中选择username ='something',然后检查结果以查看该结果的朋友数据中是否存在id。
答案 0 :(得分:1)
如果文档存在,您的查询始终会按_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
数组,如果id
列表中存在给定的数组,则该数组只包含一个friends
注意:req.session.user.id
应为Schema.Types.ObjectId
类型。