我有 followers
mongodb 中的集合如下所示:
[{
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
.这样我就可以显示 Follow
或 Unfollow
当一些用户查看另一个用户的关注者时 UI 中的按钮。
最佳答案
您需要使用如下聚合管道:
匹配
用户与对应的userId。展开
followers 数组。- 对于每个未缠绕的追随者,
投影
一个名为isFollowing
的字段,它有条件地 说明他是否是登录用户,暗示他是 搜索了用户。 Group
返回基于用户的un-wind记录,并组成一个 包含额外的isFollowing
字段的followers
数组。
代码:
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}
);
But I am getting this error from mongodb : exception: dotted field names are only allowed at the top level
你不能按阶段在组中执行 {"followers.user": loginUser}
,这是一个条件语句,只能在 $match
阶段应用.要查看所有适用的运营商分组,请参阅:operators .
关于聚合中的 Mongodb 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27264505/