我有几个文档看起来像这样:
{
"_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
},]
}
Run Code Online (Sandbox Code Playgroud)
我尝试聚合这些数据.首先展开结果数组,然后只留下" 足球 "和" 骑自行车 ",接下来计算平均结果.这部分我做了,它正在发挥作用.我的代码:
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"}}},
)
Run Code Online (Sandbox Code Playgroud)
然后我尝试通过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}}}
)
Run Code Online (Sandbox Code Playgroud)
控制台显示:出了JavaScript execution failed: ReferenceError: $average is not defined.什么问题?我在哪里弄错了?是否有可能聚合_id.league_id?
试试这个管道:
[
{$unwind:"$results"},
{$match: {"results.discipline":{$in:["football", "basketball"]}}},
{$group{_id:{player_id:"$player_id",league_id:"$league_id"}, 'average':{$avg:"$results.score"}}}
]
Run Code Online (Sandbox Code Playgroud)
它对我和你的医生有用:
{
"result" : [
{
"_id" : {
"player_id" : 0,
"league_id" : 2
},
"average" : 23.195
}
],
"ok" : 1
}
Run Code Online (Sandbox Code Playgroud)
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 }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4941 次 |
| 最近记录: |