Mongodb子查询在聚合中

时间:2014-12-03 05:44:45

标签: mongodb mongoose aggregation-framework

我在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 followedlogged in user的{​​{1}}。因此,当某些用户查看其他用户关注者时,我可以在UI中显示FollowUnfollow按钮。

1 个答案:

答案 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