MongoDBの集計フレームワーク(Aggregation Framework)でフィールド全体の平均値を取得する方法
MongoDBで特定のフィールド全体の平均値を求めたい場合、aggregate()メソッドと$avg演算子を組み合わせることで簡単に実現できます。この記事では、実際のコード例を使いながら、集計フレームワークによる平均値の計算方法を順を追って解説します。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。ここでは、プレイヤーのゲームスコアを格納するコレクション「averageAggregationDemo」を作成します。
> db.averageAggregationDemo.insertOne({"PlayerGameScore":45});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ed66bd628fa4220163b95")
}
> db.averageAggregationDemo.insertOne({"PlayerGameScore":55});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ed671d628fa4220163b96")
}
> db.averageAggregationDemo.insertOne({"PlayerGameScore":65});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ed676d628fa4220163b97")
}
> db.averageAggregationDemo.insertOne({"PlayerGameScore":35});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ed67bd628fa4220163b98")
}
> db.averageAggregationDemo.insertOne({"PlayerGameScore":16});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9ed701d628fa4220163b99")
}
登録したドキュメントの確認
find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。
> db.averageAggregationDemo.find().pretty();
上記のクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5c9ed66bd628fa4220163b95"), "PlayerGameScore" : 45 }
{ "_id" : ObjectId("5c9ed671d628fa4220163b96"), "PlayerGameScore" : 55 }
{ "_id" : ObjectId("5c9ed676d628fa4220163b97"), "PlayerGameScore" : 65 }
{ "_id" : ObjectId("5c9ed67bd628fa4220163b98"), "PlayerGameScore" : 35 }
{ "_id" : ObjectId("5c9ed701d628fa4220163b99"), "PlayerGameScore" : 16 }
集計フレームワークで平均値を取得する
フィールド全体の平均値を計算するには、aggregate()メソッド内で$groupステージを使用します。ポイントは、_idにnullを指定することで、すべてのドキュメントを1つのグループとして扱える点です。そして、$avg演算子に平均を求めたいフィールド名を指定します。
> db.averageAggregationDemo.aggregate({ "$group": { "_id": null, "PlayerGameScoreAverage": { "$avg": "$PlayerGameScore" } } } );
このクエリを実行すると、以下のような結果が出力されます。
{ "_id" : null, "PlayerGameScoreAverage" : 43.2 }
結果の解説
出力結果の「PlayerGameScoreAverage」の値「43.2」が、登録された5つのスコア(45、55、65、35、16)の平均値です。計算式は以下の通りです。
(45 + 55 + 65 + 35 + 16) / 5 = 216 / 5 = 43.2
このように、$groupステージで_id: nullを指定し、$avg演算子を使うことで、コレクション内の特定フィールド全体の平均値を簡単に算出できます。なお、$avg演算子は数値以外の値や存在しないフィールドを自動的に無視するため、欠損値を含むデータでも安心して使用できます。
-
MongoDBの集計パイプラインで点数が最も少ない2つのドキュメントを取得する方法
点数(Marks)の昇順に並べ替えたリストを取得するには $sort を使用します。さらに $limit: 2 を組み合わせることで、点数が最も少ない2件のドキュメントだけを表示できます。ここでは、実際に動作を確認できるよう、サンプル用のコレクションを作成していきましょう。1. サンプルコレクションの作成まずは insertOne() メソッドを使って、4件のドキュメントを登録します。> db.demo709.insertOne({Name:"John","Marks":75}); { "acknowledged
-
MongoDBで配列要素の平均値を取得するクエリの書き方
MongoDBで配列内の数値の平均を求める方法MongoDBでは、配列に格納された複数の数値から平均値を算出したいケースがよくあります。例えば、1つのドキュメントの中に複数の点数(Marks)が配列として保存されている場合、その平均点を取得したいことがあります。このような場合、集計パイプライン(aggregation)と$avg演算子を組み合わせることで、簡単に平均値を求めることができます。$avgは、指定したフィールド(配列の場合はその全要素)の数値の平均を自動的に計算してくれる便利な演算子です。以下、具体的な手順を見ていきましょう。1. コレクションを作成し、ドキュメントを挿入するまず、i