É importante entender que as operações no argumento para agregar() formam um pipeline . Isso significa que a entrada para qualquer elemento do pipeline é o fluxo de documentos produzido pelo elemento anterior no pipeline.
No seu exemplo, sua primeira consulta cria um pipeline de documentos que se parecem com isso:
{
"_id" : 2,
"avg_score" : 5.5
},
{
"_id" : 1,
"avg_score" : 4
}
Isso significa que o segundo elemento do pipeline está vendo uma série de documentos onde as únicas chaves são "_id" e "avg_score". As chaves "category_id" e "score" não existem mais neste fluxo de documentos.
Se você quiser agregar ainda mais nesse fluxo, precisará agregar usando as chaves que são vistas nesse estágio do pipeline. Como você deseja calcular a média das médias, é necessário inserir um único valor constante para o campo _id, para que todos os documentos de entrada sejam agrupados em um único resultado.
O código a seguir produz o resultado correto:
db.questions.aggregate(
{ $group : {
_id : "$category_id",
avg_score : { $avg : "$score" },
}
},
{ $group : {
_id : "all",
avg_score : { $avg : "$avg_score" },
}
}
);
Quando executado, ele produz a seguinte saída:
{
"result" : [
{
"_id" : "all",
"avg_score" : 4.75
}
],
"ok" : 1
}