Важно е да разберете, че операциите в аргумента на aggregate() образуват тръбопровод . Това означаваше, че входът към всеки елемент от конвейера е потокът от документи, създаден от предишния елемент в конвейера.
Във вашия пример първата ви заявка създава последователност от документи, които изглеждат така:
{
"_id" : 2,
"avg_score" : 5.5
},
{
"_id" : 1,
"avg_score" : 4
}
Това означава, че вторият елемент на конвейера вижда серия от документи, където единствените ключове са "_id" и "avg_score". Ключовете "category_id" и "score" вече не съществуват в този поток от документи.
Ако искате допълнително да агрегирате в този поток, ще трябва да агрегирате, като използвате ключовете, които се виждат на този етап в конвейера. Тъй като искате да осредните средните стойности, трябва да поставите една константна стойност за полето _id, така че всички входни документи да бъдат групирани в един резултат.
Следният код дава правилния резултат:
db.questions.aggregate(
{ $group : {
_id : "$category_id",
avg_score : { $avg : "$score" },
}
},
{ $group : {
_id : "all",
avg_score : { $avg : "$avg_score" },
}
}
);
Когато се изпълнява, той произвежда следния изход:
{
"result" : [
{
"_id" : "all",
"avg_score" : 4.75
}
],
"ok" : 1
}