Aggregate()の引数の演算がパイプラインを形成することを理解することが重要です。 。これは、パイプラインの任意の要素への入力が、パイプラインの前の要素によって生成されたドキュメントのストリームであることを意味しました。
この例では、最初のクエリで次のようなドキュメントのパイプラインが作成されます。
{
"_id" : 2,
"avg_score" : 5.5
},
{
"_id" : 1,
"avg_score" : 4
}
これは、パイプラインの2番目の要素が、「_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
}