2013-06-17 2 views
4

J'ai plusieurs documents qui ressemble à ceci:

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

J'essaie d'agréger ces données. Tout d'abord déroulage tableau résultats, laissez seulement « le football » et « vélo », le nombre suivant moyenne des résultats. Cette partie que j'ai faite, et ça marche. Mon code:

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"}}}, 
    ) 

Ensuite, j'essaie d'agréger par league_id, cela signifie, les résultats moyens des joueurs dans les ligues spécifiques, ajouter au code ci-dessus: {$group:{_id:"$_id.league_id",aver_league:{$avg:$average}}}

Et par code ressemble à:

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}}} 
     ) 

Affichages de la console: JavaScript execution failed: ReferenceError: $average is not defined. Qu'est-ce qui ne va pas? Où ai-je fait une erreur? Est-il possible de regrouper par _id.league_id?

+1

voulez-vous dire {dérouleur $: "Résultats de $"}? –

+0

Oui, '{$ unwind:" $ results "}', édité et corrigé. – tostao

Répondre

4

Essayez ce pipeline:

[ 
{$unwind:"$results"}, 
{$match: {"results.discipline":{$in:["football", "basketball"]}}}, 
{$group{_id:{player_id:"$player_id",league_id:"$league_id"}, 'average':{$avg:"$results.score"}}} 
] 

cela fonctionne pour moi avec votre doc:

{ 
"result" : [ 
    { 
     "_id" : { 
      "player_id" : 0, 
      "league_id" : 2 
     }, 
     "average" : 23.195 
    } 
], 
"ok" : 1 
} 

UPD. Si vous voulez à nouveau groupe, par 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

Oui, cela fonctionne, s'il vous plaît ajouter: '{$ groupe: {_ id:" $ _ id.league_id ", aver_league: {$ moy: $ moyen}}}'. Parce que c'est un problème. – tostao