Il est important de comprendre que les opérations dans l'argument d'aggregate() forment un pipeline . Cela signifie que l'entrée de tout élément du pipeline est le flux de documents produits par l'élément précédent du pipeline.
Dans votre exemple, votre première requête crée un pipeline de documents qui ressemble à ceci :
{
"_id" : 2,
"avg_score" : 5.5
},
{
"_id" : 1,
"avg_score" : 4
}
Cela signifie que le deuxième élément du pipeline est de voir une série de documents où les seules clés sont "_id" et "avg_score". Les clés "category_id" et "score" n'existent plus dans ce flux de documents.
Si vous souhaitez agréger davantage sur ce flux, vous devrez agréger à l'aide des clés qui sont vues à ce stade du pipeline. Puisque vous voulez faire la moyenne des moyennes, vous devez mettre une seule valeur constante pour le champ _id, afin que tous les documents d'entrée soient regroupés en un seul résultat.
Le code suivant produit le bon résultat :
db.questions.aggregate(
{ $group : {
_id : "$category_id",
avg_score : { $avg : "$score" },
}
},
{ $group : {
_id : "all",
avg_score : { $avg : "$avg_score" },
}
}
);
Lorsqu'il est exécuté, il produit la sortie suivante :
{
"result" : [
{
"_id" : "all",
"avg_score" : 4.75
}
],
"ok" : 1
}