MongoDB双重$group聚合

6

我有几个类似于这样的文档:

{
        "_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
                },]
}

我尝试聚合这些数据。首先展开结果数组,然后只保留“足球”和“骑行”,接下来计算平均值。这部分我已经完成,并且它是有效的。 我的代码:

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执行失败:ReferenceError:$average未定义。出了什么问题?我犯了什么错误?是否可以按_id.league_id聚合?

1个回答

5
请尝试使用以下流程:
[
 {$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
}

更新. 如果你想再次按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 }

1
是的,它有效,请添加:{$group:{_id:"$_id.league_id",aver_league:{$avg:$average}}}。因为这是一个问题。 - tostao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接