Ważne jest, aby zrozumieć, że operacje w argumencie agregacji() tworzą potok . Oznaczało to, że dane wejściowe do dowolnego elementu potoku to strumień dokumentów wytworzony przez poprzedni element potoku.
W twoim przykładzie pierwsze zapytanie tworzy potok dokumentów, które wyglądają tak:
{
"_id" : 2,
"avg_score" : 5.5
},
{
"_id" : 1,
"avg_score" : 4
}
Oznacza to, że drugim elementem pipline jest seria dokumentów, w których jedynymi kluczami są „_id” i „avg_score”. Klucze „category_id” i „score” już nie istnieją w tym strumieniu dokumentów.
Jeśli chcesz dalej agregować w tym strumieniu, musisz agregować przy użyciu kluczy widocznych na tym etapie potoku. Ponieważ chcesz uśrednić średnie, musisz wprowadzić jedną stałą wartość w polu _id, aby wszystkie dokumenty wejściowe zostały zgrupowane w jeden wynik.
Poniższy kod daje poprawny wynik:
db.questions.aggregate(
{ $group : {
_id : "$category_id",
avg_score : { $avg : "$score" },
}
},
{ $group : {
_id : "all",
avg_score : { $avg : "$avg_score" },
}
}
);
Po uruchomieniu generuje następujące dane wyjściowe:
{
"result" : [
{
"_id" : "all",
"avg_score" : 4.75
}
],
"ok" : 1
}