Det er vigtigt at forstå, at operationerne i argumentet to aggregate() danner en pipeline . Dette betød, at input til ethvert element i pipelinen er strømmen af dokumenter produceret af det forrige element i pipelinen.
I dit eksempel opretter din første forespørgsel en pipeline af dokumenter, der ser sådan ud:
{
"_id" : 2,
"avg_score" : 5.5
},
{
"_id" : 1,
"avg_score" : 4
}
Det betyder, at det andet element i piplinen er at se en række dokumenter, hvor de eneste nøgler er "_id" og "avg_score". Nøglerne "category_id" og "score" findes ikke længere i denne dokumentstrøm.
Hvis du vil aggregere yderligere på denne strøm, skal du aggregere ved hjælp af de nøgler, der ses på dette trin i pipelinen. Da du vil beregne gennemsnittet af gennemsnittet, skal du indsætte en enkelt konstant værdi for _id-feltet, så alle inputdokumenterne bliver grupperet i et enkelt resultat.
Følgende kode giver det korrekte resultat:
db.questions.aggregate(
{ $group : {
_id : "$category_id",
avg_score : { $avg : "$score" },
}
},
{ $group : {
_id : "all",
avg_score : { $avg : "$avg_score" },
}
}
);
Når den køres, producerer den følgende output:
{
"result" : [
{
"_id" : "all",
"avg_score" : 4.75
}
],
"ok" : 1
}