MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBの集計フレームワークで平均値を取得する方法

MongoDBで数値の平均を求めたい場合は、$avg演算子を集計フレームワーク(aggregation framework)と組み合わせて使用します。この記事では、学生のスコアデータを例に、コレクションの作成から平均値の計算までの手順を具体的に解説します。

1. サンプルコレクションの作成

まず、ドキュメントを格納するコレクションを作成します。ここでは、ネストされたフィールドの一つとして「StudentScore」を持つドキュメントを3件挿入します。

> db.averageReturiningNullDemo.insertOne(
   {"StudentDetails" : { "StudentScore" : 89 }
});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ce9822e78f00858fb12e927")
}
> db.averageReturiningNullDemo.insertOne(
   {"StudentDetails" : { "StudentScore" : 34 }
});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ce9822e78f00858fb12e928")
}
> db.averageReturiningNullDemo.insertOne(
   {"StudentDetails" : { "StudentScore" : 78 }
});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ce9822e78f00858fb12e929")
}

2. 登録したドキュメントの確認

次に、find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。

> db.averageReturiningNullDemo.find().pretty();

このクエリを実行すると、以下のように登録済みの3件のドキュメントが出力されます。

{
   "_id" : ObjectId("5ce9822e78f00858fb12e927"),
   "StudentDetails" : {
       "StudentScore" : 89
   }
}
{
   "_id" : ObjectId("5ce9822e78f00858fb12e928"),
   "StudentDetails" : {
       "StudentScore" : 34
   }
}
{
   "_id" : ObjectId("5ce9822e78f00858fb12e929"),
   "StudentDetails" : {
       "StudentScore" : 78
   }
}

3. $avg演算子で平均値を計算する

続いて、aggregate()メソッドを使って平均値を求めるクエリを見ていきましょう。$groupステージで「_id」にnullを指定すると、コレクション全体が1つのグループとして扱われます。そのうえで、$avg演算子に「$StudentDetails.StudentScore」を渡すことで、ネストされたフィールドの平均を計算できます。

> db.averageReturiningNullDemo.aggregate([
   {
       "$group": {
           "_id": null,
           "StudentScoreAverage": {
               "$avg": "$StudentDetails.StudentScore"
           }
       }
   }
]);

4. 実行結果

上記のパイプラインを実行すると、以下のような結果が得られます。

{ "_id" : null, "StudentScoreAverage" : 67 }

出力された「StudentScoreAverage」の値は67です。これは、3件のスコア(89・34・78)の合計201を3で割った平均値と一致しています。

ポイントまとめ

  • $groupの_idにnullを指定すると、ドキュメント全体を単一グループとして集計できます。
  • $avg演算子は、数値以外の値や存在しないフィールドを自動的に無視して平均を計算します。
  • ネストされたフィールドを参照する場合は、「$親フィールド.子フィールド」の形式でパスを指定します。

このように、MongoDBの集計フレームワークを使えば、複雑な統計処理もシンプルなパイプラインの組み合わせで効率的に実現できます。条件を絞りたい場合は、$matchステージを$groupの前に追加するだけで、特定の条件に合致するドキュメントだけを対象とした平均計算も可能です。

  1. MongoDBの集計パイプラインで点数が最も少ない2つのドキュメントを取得する方法

    点数(Marks)の昇順に並べ替えたリストを取得するには $sort を使用します。さらに $limit: 2 を組み合わせることで、点数が最も少ない2件のドキュメントだけを表示できます。ここでは、実際に動作を確認できるよう、サンプル用のコレクションを作成していきましょう。1. サンプルコレクションの作成まずは insertOne() メソッドを使って、4件のドキュメントを登録します。> db.demo709.insertOne({Name:"John","Marks":75}); {    "acknowledged

  2. MongoDBのAggregateでドキュメントと配列要素の平均値を取得する方法

    MongoDBでドキュメントのフィールドおよび配列内の各要素の平均値を求めるには、aggregate()メソッドと$groupステージを組み合わせ、平均を計算する$avg演算子を使用します。ここでは、実際にサンプルコレクションを作成しながら、具体的な手順を解説します。 サンプルコレクションの作成 まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成します。 > db.demo598.insertOne( ...    { ...       Information:Student, ...   &