Det är viktigt att förstå att operationerna i argumentet to aggregate() bildar en pipeline . Detta innebar att indata till valfritt element i pipelinen är strömmen av dokument som produceras av det föregående elementet i pipelinen.
I ditt exempel skapar din första fråga en pipeline av dokument som ser ut så här:
{
"_id" : 2,
"avg_score" : 5.5
},
{
"_id" : 1,
"avg_score" : 4
}
Detta betyder att det andra elementet i piplinen ser en serie dokument där de enda nycklarna är "_id" och "avg_score". Nycklarna "category_id" och "score" finns inte längre i den här dokumentströmmen.
Om du vill aggregera ytterligare på den här strömmen måste du aggregera med hjälp av nycklarna som visas i det här skedet i pipelinen. Eftersom du vill beräkna medelvärdena måste du lägga in ett enda konstant värde för fältet _id, så att alla indatadokument grupperas till ett enda resultat.
Följande kod ger det korrekta resultatet:
db.questions.aggregate(
{ $group : {
_id : "$category_id",
avg_score : { $avg : "$score" },
}
},
{ $group : {
_id : "all",
avg_score : { $avg : "$avg_score" },
}
}
);
När den körs producerar den följande utdata:
{
"result" : [
{
"_id" : "all",
"avg_score" : 4.75
}
],
"ok" : 1
}