2014-11-13 172 views
2

我有以下形式的MongoDB的數據(MgO)的聚集:Golang 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.value.team1時data.statistics.gsm的平均.type ==使用Golang MongoDB驅動程序mgo進行「攻擊」。代碼,我到目前爲止已經試過(有一個或兩個下面的語句組):

pipeline := []bson.M{ 
    bson.M{"$match": bson.M{"kick_off.utc.gsm.date_time": bson.M{"$gt": start, "$lt": end}}}, 
bson.M{ 
     "$group": bson.M{ 
      "_id":  "$gsm_id", 
    "event_array" : bson.M{"$first": "$data.statistics.gsm"}}}, 
bson.M{ 
      "$group": bson.M{ 
       "_id":  "$type", 
      "avg_attack" : bson.M{"$avg": "$data.statistics.gsm.value.team1"}}}} 

由於只有第一組發言,我回去以下,但第二組語句不幫我弄的平均。

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

回答

1

我總是發現它有助於獲得json的漂亮打印視圖。這裏是你說你從第一組發言得到:

[ 
{ 
"_id":1953009, 
"event_array":[ 
    { 
    "type":"Attacks", 
    "value":{ 
     "team1":48, 
     "team2":12 
    } 
    }, 
    { 
    "type":"Corners", 
    "value":{ 
     "team1":12, 
     "team2":0 
    } 
    }, 
... 

現在你使用第二組聲明:

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

你試圖採取的data.statistics.gsm.value.team1平均上的結果第一組聲明,但這並不存在於第一組聲明的結果中,所以當然它不會給你一個平均值。

而不是你正在使用的方法,我建議看看$unwind operator將數組分解成一組文件,然後你應該能夠以你想要的方式將它們分組{$avg: "$value.team1"}

因此,用於生成聚合的整個管道將爲:$match -> $group1 -> $unwind -> $group2。請記住,管道的每個階段都是根據前一階段生成的數據進行操作,這就是爲什麼您的零件不正確。