具有嵌套数组的Golang MongoDB(mgo)聚合

具有嵌套数组的Golang MongoDB(mgo)聚合,mongodb,go,aggregation-framework,mgo,Mongodb,Go,Aggregation Framework,Mgo,我有以下形式的MongoDB数据: {"_id":"53eb9a5673a57578a10074ec","data":{"statistics":{"gsm":[{"type":"Attacks","value":{"team1":66,"team2":67}},{"type":"Corners","value":{"team1":8,"team2":5}},{"type":"Dangerous attacks","value":{"team1":46,"team2":49}},{"type":

我有以下形式的MongoDB数据:

{"_id":"53eb9a5673a57578a10074ec","data":{"statistics":{"gsm":[{"type":"Attacks","value":{"team1":66,"team2":67}},{"type":"Corners","value":{"team1":8,"team2":5}},{"type":"Dangerous attacks","value":{"team1":46,"team2":49}},{"type":"Fouls","value":{"team1":9,"team2":14}},{"type":"Free kicks","value":{"team1":18,"team2":10}},{"type":"Goals","value":{"team1":2,"team2":1}},{"type":"Goal kicks","value":{"team1":10,"team2":11}},{"type":"Offsides","value":{"team1":1,"team2":4}},{"type":"Posession","value":{"team1":55,"team2":45}},{"type":"Shots blocked","value":{"team1":4,"team2":1}},{"type":"Shots off target","value":{"team1":7,"team2":5}}]}}}
当data.statistics.gsm.type==使用Golang MongoDB驱动程序mgo进行“攻击”时,我想获得data.statistics.gsm.value.team1的平均值。到目前为止我已经尝试过的代码(使用下面的一个或两个组语句):

只有第一个group语句,我得到了下面的结果,但是第二个group语句不能帮助我得到平均值

[{"_id":1953009,"event_array":[{"type":"Attacks","value":{"team1":48,"team2":12}},{"type":"Corners","value":{"team1":12,"team2":0}},{"type":"Dangerous attacks","value":{"team1":46,"team2":7}},{"type":"Fouls","value":{"team1":10,"team2":3}},{"type":"Free kicks","value":{"team1":5,"team2":12}},{"type":"Goals","value":{"team1":8,"team2":0}}

我总是觉得获得json的漂亮打印视图很有帮助。以下是您从第一组声明中得到的信息:

[  
{  
"_id":1953009,
"event_array":[  
  {  
    "type":"Attacks",
    "value":{  
      "team1":48,
      "team2":12
    }
  },
  {  
    "type":"Corners",
    "value":{  
      "team1":12,
      "team2":0
    }
  },
...
现在使用第二个group语句:

"$group": bson.M{
     "_id":     "$type",
     "avg_attack" : bson.M{"$avg": "$data.statistics.gsm.value.team1"}
}
您试图在第一个group语句的结果上取
data.statistics.gsm.value.team1
的平均值,但这在第一个group语句的结果中不存在,因此它当然不会给出平均值

我建议您不要使用您正在使用的方法,而是研究将数组分解为一组文档的方法,然后您应该能够使用
{$avg:“$value.team1”}
以您在这里尝试的方式对它们进行分组

因此,用于生成聚合的整个管道是:
$match->$group1->$unwind->$group2
。请记住,管道的每个阶段都是在前一阶段生成的数据上运行的,这就是为什么
data.statistics.gsm.value.team1
部分不正确的原因

"$group": bson.M{
     "_id":     "$type",
     "avg_attack" : bson.M{"$avg": "$data.statistics.gsm.value.team1"}
}