Mogodb聚合

时间:2017-04-08 19:00:41

标签: node.js mongodb mongoose aggregation-framework

这是我的用户集

{ 
    "_id" : ObjectId("58e8cb640f861e6c40627a06"), 
    "actorId" : "665991", 
    "login" : "petroav", 
    "gravatar_id" : "", 
    "url" : "https://api.github.com/users/petroav", 
    "avatar_url" : "https://avatars.githubusercontent.com/u/665991?" 

}

这是我的回购集合

{ 
    "_id" : ObjectId("58e8cb640f861e6c40627a07"), 
    "repoId" : "28688495", 
    "name" : "petroav/6.828", 
    "url" : "https://api.github.com/repos/petroav/6.828"
}

这是我的活动集

{ 
    "_id" : ObjectId("58e8cb640f861e6c40627a08"), 
    "eventId" : "2489651045", 
    "type" : "CreateEvent", 
    "actorLogin" : "petroav", 
    "repoId" : "28688495", 
    "eventDate" : ISODate("2015-01-01T15:00:00.000+0000"), 
    "public" : true         
}

我正在尝试对以上数据进行以下查询

  1. 返回所有存储库及其最高贡献者的列表
  2. 查找来自演员的事件数量最多的存储库(通过登录)。如果多个repos具有相同数量的事件,请返回具有最新事件的事件。
  3. 通过登录
  4. 返回演员详细信息和贡献的存储库列表

    我通过这样做尝试了3个

    db.events.aggregate(
       [    {
                $match:{"actorLogin":"petroav"}
            },
            {
                $lookup:{
                    from:"repos",
                    localField:"repoId",
                    foreignField:"repoId",
                    as:"Repostory"
                    }
            },
            {
                $group:{ _id : "$Repostory", repo: { $push: "$$ROOT" } } 
            }
    
       ]
    ).pretty()
    

    请帮忙。我是mongodb的新手。

1 个答案:

答案 0 :(得分:0)

这些应该起作用,如果它们与您的代码不完全匹配,则可能必须更新一些变量名。因为您使用actorLogin和repoId而不是_id作为引用,所以您可能想为字段创建索引以帮助提高性能。

如果您要清理最终格式,删除多余的字段,重命名字段等,也可以在这些管道的末尾添加$ project阶段。

对于数字1

db.repos.aggregate(
    [    
         {
             $lookup:{
                 from:"events",
                 localField:"repoId",
                 foreignField:"repoId",
                 as:"Event"
                 }
         },{
             $unwind:"$Event"
         },
         {
             $group:{ 
                 _id : {repo: "$_id", user: "$Event.actorLogin" }, 
                 contributionCount: { $sum:1 },//number of times logged in
                } 
         },
         { 
             $sort: {
                contributionCount: -1
            } 
        },{
            $group:{
                _id: {repo:'$_id.repo'},
                contributionCount: {$first: '$contributionCount' },
                actorLogin: {$first: '$_id.user' }
            } 
        } 
    ]
 ).then(console.log)

对于数字2

db.events.aggregate(
    [    {
             $match:{"actorLogin":"petroav"}
         },
         {
             $lookup:{
                 from:"repos",
                 localField:"repoId",
                 foreignField:"repoId",
                 as:"Repostory"
                 }
         },{
             $unwind:"$Repostory"
         },
         {
             $group:{ 
                 _id : "$Repostory", 
                 loginCount: { $sum:1 },//number of times logged in
                 lastLoginDate: {$max:'$eventDate'} //largest ISODate for the repo
                } 
         },
         { 
             $sort: {
                  loginCount: -1, 
                  date: -1
            } 
        },
        {limit:1}

    ]
 ).then(console.log)    

对于数字3

db.user.aggregate(
         [    
             {
            $match:{"actorLogin":"petroav"}
        },
        {
           $lookup:{
               from:"events",
               localField:"actorLogin",
               foreignField:"actorLogin",
               as:"Events"
               }
       },{
           $unwind:"$Events"
       },
        {
            $lookup:{
                from:"repos",
                localField:"Events.repoId",
                foreignField:"repoId",
                as:"Repostory"
                }
        },{
             $unwind:"$Repostory"
         },{
             $group: {
                 _id:'$actorLogin',
                 user: {$first:'$$ROOT'}
                 repos: {$addToSet:'$Repostory'}

             }
         }
    ]
 ).then(console.log)