聚合中的 Mongodb 子查询

标签 mongodb mongoose aggregation-framework

我有 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 .这样我就可以显示 FollowUnfollow当一些用户查看另一个用户的关注者时 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/

相关文章:

javascript - 如何在express js中构建站点地图?

mongodb - 如何求数组内所有元素的总和

java.lang.IllegalArgumentException : Invalid reference performing aggregation in MongoDB 异常

MongoDB : Is there a way to detect a value trend using aggregation?

node.js - 如何在Connect中间件中异步调用mongoDB?

mongodb - Elasticsearch作为主要存储

javascript - 如何在 MongoDB 集合上循环文档并对每个文档执行发布请求?

mongodb - mongoDB 中是否可以使用循环对象引用?

session - node.js + express.js : session handling with mongodb/mongoose

node.js - Mongoose Stream,如何更新每个文档?