È importante capire che le operazioni nell'argomento per aggregate() formano una pipeline . Ciò significava che l'input per qualsiasi elemento della pipeline è il flusso di documenti prodotti dall'elemento precedente nella pipeline.
Nel tuo esempio, la tua prima query crea una pipeline di documenti simile a questa:
{
"_id" : 2,
"avg_score" : 5.5
},
{
"_id" : 1,
"avg_score" : 4
}
Ciò significa che il secondo elemento della pipline vede una serie di documenti in cui le uniche chiavi sono "_id" e "avg_score". Le chiavi "category_id" e "score" non esistono più in questo flusso di documenti.
Se desideri aggregare ulteriormente su questo flusso, dovrai aggregare utilizzando le chiavi visualizzate in questa fase della pipeline. Poiché si desidera calcolare la media delle medie, è necessario inserire un unico valore costante per il campo _id, in modo che tutti i documenti di input vengano raggruppati in un unico risultato.
Il codice seguente produce il risultato corretto:
db.questions.aggregate(
{ $group : {
_id : "$category_id",
avg_score : { $avg : "$score" },
}
},
{ $group : {
_id : "all",
avg_score : { $avg : "$avg_score" },
}
}
);
Quando viene eseguito, produce il seguente output:
{
"result" : [
{
"_id" : "all",
"avg_score" : 4.75
}
],
"ok" : 1
}