Ответ 1
Важно понимать, что операции в аргументе aggregate() образуют конвейер. Это означало, что вход для любого элемента конвейера является потоком документов, созданных предыдущим элементом в конвейере.
В вашем примере ваш первый запрос создает конвейер документов, которые выглядят следующим образом:
{
"_id" : 2,
"avg_score" : 5.5
},
{
"_id" : 1,
"avg_score" : 4
}
Это означает, что во втором элементе pipline видна серия документов, в которой единственными ключами являются "_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
}