Het is belangrijk om te begrijpen dat de bewerkingen in het argument om te aggregeren() een pijplijn vormen . Dit betekende dat de invoer voor elk element van de pijplijn de stroom documenten is die is geproduceerd door het vorige element in de pijplijn.
In uw voorbeeld creëert uw eerste zoekopdracht een pijplijn van documenten die er als volgt uitzien:
{
"_id" : 2,
"avg_score" : 5.5
},
{
"_id" : 1,
"avg_score" : 4
}
Dit betekent dat het tweede element van de pipline een reeks documenten ziet waar de enige sleutels "_id" en "avg_score" zijn. De toetsen "category_id" en "score" bestaan niet meer in deze documentenstroom.
Als u verder wilt aggregeren op deze stream, moet u aggregeren met behulp van de sleutels die in dit stadium van de pijplijn worden weergegeven. Aangezien u de gemiddelden wilt middelen, moet u een enkele constante waarde invoeren voor het veld _id, zodat alle invoerdocumenten in één resultaat worden gegroepeerd.
De volgende code geeft het juiste resultaat:
db.questions.aggregate(
{ $group : {
_id : "$category_id",
avg_score : { $avg : "$score" },
}
},
{ $group : {
_id : "all",
avg_score : { $avg : "$avg_score" },
}
}
);
Wanneer het wordt uitgevoerd, produceert het de volgende uitvoer:
{
"result" : [
{
"_id" : "all",
"avg_score" : 4.75
}
],
"ok" : 1
}