2014-11-13 4 views
2

중첩 배열과 (산화 마그네슘) 통합 :Golang MongoDB를 나는 다음과 같은 형태의 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 data.statistics.gsm.value.team1의 평균을 얻으려면을 .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입니다. 이전 단계에서 생성 된 데이터에 대해 파이프 라인의 각 단계가 작동 중이므로 data.statistics.gsm.value.team1 부분이 올바르지 않은 것입니다.

관련 문제