首页 文章

MongoDB双$ group聚合

提问于
浏览
5

我有几个文档看起来像这样:

{
        "_id" : ObjectId("50b59cd75bed76f46522c34e"),
        "player_id" : 0,
        "league_id" : 2,
        "results" : [
                {   "discipline" : "football",
                    "score" : 25.15
                },
                {
                        "discipline" : "basketball",
                        "score" : 21.24
                },
                {
                        "discipline" : "cycling",
                        "score" : 68.19
                },]
}

我尝试聚合这些数据 . 首先 unwind 结果数组,然后只留下“ football " and " cycling ”,下次计数 average 结果 . 这部分我做了,它正在工作 . 我的代码:

db.grades.aggregate(
    {$unwind:"$results"},
    {$match: {$or: [{"results.discipline":"football"},{"results.discipline":"cycling"} ]}},
    {$group:{_id:{player_id:"$player_id",league_id:"$league_id"}, 'average':{$avg:"$results.score"}}},
    )

然后我尝试聚合 league_id ,这意味着,普通玩家在特定联赛中的结果,添加到上面的代码: {$group:{_id:"$_id.league_id",aver_league:{$avg:$average}}}

现在代码看起来像:

db.grades.aggregate(
        {$unwind:"$results"},
        {$match: {$or: [{"results.discipline":"football"},{"results.discipline":"cycling"} ]}},
        {$group:{_id:{player_id:"$player_id",league_id:"$league_id"}, 'average':{$avg:"$results.score"}}},
{$group:{_id:"$_id.league_id",aver_league:{$avg:$average}}}
        )

控制台显示: JavaScript execution failed: ReferenceError: $average is not defined. 有什么问题?我在哪里弄错了?可以通过 _id.league_id 汇总吗?

1 回答

  • 4

    试试这个管道:

    [
     {$unwind:"$results"}, 
     {$match: {"results.discipline":{$in:["football", "basketball"]}}}, 
     {$group{_id:{player_id:"$player_id",league_id:"$league_id"}, 'average':{$avg:"$results.score"}}} 
    ]
    

    它适用于我的文档:

    {
    "result" : [
        {
            "_id" : {
                "player_id" : 0,
                "league_id" : 2
            },
            "average" : 23.195
        }
    ],
    "ok" : 1
    }
    

    UPD. 如果要再次分组,请 league_id

    [{$unwind:"$results"}, 
    {$match: {"results.discipline":{$in:["football", "basketball"]}}}, 
    {$group:{_id:{player_id:"$player_id",league_id:"$league_id"}, 'average':{$avg:"$results.score"}  }}, 
    {$group:{_id:"$_id.league_id", 'average':{$avg:"$average"}  }} ]
    
    { "result" : [ { "_id" : 2, "average" : 23.195 } ], "ok" : 1 }
    

相关问题