MongoDB聚合中的子查询

3

我在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: 点分字段名只允许在顶层 我应该怎么做才能知道特定的follower是否正在被logged in user关注。这样当某个用户查看另一个用户的关注者时,我就可以在UI中显示FollowUnfollow按钮。
1个回答

1
你需要按照以下聚合管道操作:
  • Match 用户与对应的 userId 匹配。
  • Unwind 展开 followers 数组。
  • 针对每个展开的 follower,project 一个名为 isFollowing 的字段,表示是否为当前登录的用户,即搜索到的用户的关注者。
  • Group 回未展开的记录,基于用户,并结合额外的 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}
);

但是我从mongodb得到了这个错误:例外:只允许在顶层使用点字段名称

你不能在分组阶段中执行 {"followers.user" : loginUser},这是一个条件语句,只能在 $match 阶段应用。要查看所有适用的分组运算符,请参考:operators


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接