Je důležité pochopit, že operace v argumentu pro agregaci() tvoří potrubí . To znamenalo, že vstupem do jakéhokoli prvku kanálu je proud dokumentů vytvořený předchozím prvkem v kanálu.
Ve vašem příkladu váš první dotaz vytvoří kanál dokumentů, které vypadají takto:
{
"_id" : 2,
"avg_score" : 5.5
},
{
"_id" : 1,
"avg_score" : 4
}
To znamená, že druhým prvkem pipline je vidět série dokumentů, kde jedinými klíči jsou „_id“ a „avg_score“. Klíče „category_id“ a „score“ již neexistují v tomto streamu dokumentů.
Pokud chcete v tomto streamu dále agregovat, budete muset agregovat pomocí klíčů, které jsou vidět v této fázi kanálu. Protože chcete průměrovat průměry, musíte do pole _id zadat jednu konstantní hodnotu, aby se všechny vstupní dokumenty seskupily do jednoho výsledku.
Následující kód poskytuje správný výsledek:
db.questions.aggregate(
{ $group : {
_id : "$category_id",
avg_score : { $avg : "$score" },
}
},
{ $group : {
_id : "all",
avg_score : { $avg : "$avg_score" },
}
}
);
Při spuštění vytváří následující výstup:
{
"result" : [
{
"_id" : "all",
"avg_score" : 4.75
}
],
"ok" : 1
}