首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mogodb聚合

Mogodb聚合
EN

Stack Overflow用户
提问于 2017-04-08 19:00:41
回答 1查看 58关注 0票数 0

这是我的用户集合

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

}

这是我的回购收藏

代码语言:javascript
复制
{ 
    "_id" : ObjectId("58e8cb640f861e6c40627a07"), 
    "repoId" : "28688495", 
    "name" : "petroav/6.828", 
    "url" : "https://api.github.com/repos/petroav/6.828"
}

这是我的事件集合

代码语言:javascript
复制
{ 
    "_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. 通过登录返回参与者详细信息和贡献存储库列表

我试了三次这样做

代码语言:javascript
复制
db.events.aggregate(
   [    {
            $match:{"actorLogin":"petroav"}
        },
        {
            $lookup:{
                from:"repos",
                localField:"repoId",
                foreignField:"repoId",
                as:"Repostory"
                }
        },
        {
            $group:{ _id : "$Repostory", repo: { $push: "$$ROOT" } } 
        }

   ]
).pretty()

请帮帮忙。我是蒙哥大的新手。

EN

回答 1

Stack Overflow用户

发布于 2019-06-15 08:23:44

如果这些变量名称与代码不完全匹配,则可能需要更新它们。因为您使用actorLogin和repoId作为引用而不是_id,所以您可能希望为字段创建索引以帮助提高性能。

此外,如果要清理最终格式、删除额外字段、重命名字段等,则可能需要在这些管道的末尾添加一个$project阶段。

编号1

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43299191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档