我在mongodb中收集了followers
,如下所示:
[{
user : <userId> ,
followers : [
{
user : <userId>
, createdOn : <Date>
,...
}
,
{
user : <userId>
, createdOn : <Date>
,...
}
]
},
{
user : <userId> ,
followers : [
{
user : <userId>
, createdOn : <Date>
,...
}
,
{
user : <userId>
, createdOn : <Date>
,...
}
]
}]
当用户请求/api/users/<userId>/followers
时,我正在尝试提供用户<userId>
的所有关注者。此外,我还尝试设置一个标记,以表示<userId>
用户是否跟随loggedIn
用户的特定关注者。我想输出如下内容:
{
user : <userId>
, followers : [
{
user : <userId>
, isFollowing : <Boolean>
}
,
{
user : <userId>
, isFollowing : <Boolean>
}
]
}
我试一试,我的失败尝试看起来像这样:
app.get('/users/:userId/followers', function(req, res) {
var userId = req.params.userId;
var loginUser = req.user._id; // I am using passport for user authentication
var Follower = mongoose.model('followers'); // I am using mongoose also
var DocumentObjectId = mongoose.Types.ObjectId;
Follower.aggregate([
{$match : { user : DocumentObjectId(userId)}}
, {$project : {"followers" : 1, "_id" : 0}}
, {$unwind : "$followers"}
, {$group : {
_id : {"user : "$user"}
, "followers" : {$push:{
"user" : "$followers.user"
, "isFollowing" : {$and : [{user: "$followers.user"}, {"followers.user" : loginUser}]}
}}
}}
])
})
但我从mongodb收到此错误:
exception: dotted field names are only allowed at the top level
我应该怎样做才能知道follower
followed
是logged in user
的{{1}}。因此,当某些用户查看其他用户关注者时,我可以在UI中显示Follow
或Unfollow
按钮。
答案 0 :(得分:1)
您需要使用汇总管道,如下所示:
Match
具有相应userId的用户。Unwind
关注者阵列。project
有条件地命名为isFollowing
的字段
说明他是否是登录用户,暗示他是该用户的追随者
搜索用户。Group
根据用户支持未缠绕的记录,然后撰写
带有额外followers
字段的isFollowing
数组。守则:
var loginUser = 2;
var userId = 3;
var documentObjectId = mongoose.Types.ObjectId;
Follower.aggregate(
{$match:{"user":documentObjectId(userId)}},
{$unwind:"$followers"},
{$project:{"user":1,"_id":0,
"follower":"$followers.user",
"isFollowing":{$cond:[{$eq:["$followers.user",loginUser]}
,true,false]}}},
{$group:{"_id":"$user",
"followers":{$push: {"user":"$follower",
"isFollowing":"$isFollowing"}}}},
function(err,resp){//handle response}
);
但我从mongodb收到此错误:异常:虚拟字段名称仅允许在顶级
您不能逐个进行{"followers.user" : loginUser}
,这是一个标准声明,只能在$match
阶段应用。要按运营商查看所有适用的群组,请参阅:operators。