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

【MongoDB】配列内のスコア平均を計算し、元のドキュメントにフィールドとして追加する方法

$avg演算子とアグリゲーションフレームワークの活用

MongoDBでは、$avg演算子をアグリゲーションフレームワーク(aggregate)と組み合わせることで、配列内の数値の平均値を簡単に計算できます。さらに$addFieldsステージを使えば、計算結果を元のドキュメントに新しいフィールドとして含めることも可能です。まずは、学生ごとのスコアを持つ配列を含むサンプルコレクションを作成しましょう。

> db.averageOfRatingsInArrayDemo.insertOne(
...    {
...       "StudentDetails" : [
...          {
...             "StudentId" : 1,
...             "StudentScore" : 45
...          },
...          {
...             "StudentId" : 2,
...             "StudentScore" : 58
...          },
...          {
...             "StudentId" : 3,
...             "StudentScore" : 67
...          }
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5cd427dc2cba06f46efe9ee4")
}

find()メソッドを使うと、コレクション内のすべてのドキュメントを確認できます。

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

このクエリを実行すると、次のような結果が出力されます。

{
   "_id" : ObjectId("5cd427dc2cba06f46efe9ee4"),
   "StudentDetails" : [
      {
         "StudentId" : 1,
         "StudentScore" : 45
      },
      {
         "StudentId" : 2,
         "StudentScore" : 58
      },
      {
         "StudentId" : 3,
         "StudentScore" : 67
      }
   ]
}

平均値を計算して元のドキュメントに追加する

それでは、配列内のスコアの平均を計算し、その結果を元のドキュメントにフィールドとして含めるクエリを見てみましょう。$addFieldsステージの中で$avg演算子を使用し、"$StudentDetails.StudentScore"というパスで配列内の各スコアを参照しています。

> db.averageOfRatingsInArrayDemo.aggregate([ { $addFields : { StudentScoreAverage : { $avg : "$StudentDetails.StudentScore" } } } ]);

実行すると、以下のようにStudentScoreAverageという新しいフィールドが自動的に追加され、平均値(約56.67)が計算されて表示されます。

{ "_id" : ObjectId("5cd427dc2cba06f46efe9ee4"), "StudentDetails" : [ { "StudentId" : 1, "StudentScore" : 45 }, { "StudentId" : 2, "StudentScore" : 58 }, { "StudentId" : 3, "StudentScore" : 67 } ], "StudentScoreAverage" : 56.666666666666664 }

計算結果をドキュメントに永続的に保存するには

なお、aggregate()メソッドはあくまで計算結果を表示するだけであり、元のコレクションのデータ自体は書き換えられません。平均値をドキュメントに恒久的に保存したい場合は、MongoDB 4.2以降で利用可能なアップデート用のパイプライン構文を使用します。

db.averageOfRatingsInArrayDemo.updateMany(
   {},
   [
      { $set: { StudentScoreAverage: { $avg: "$StudentDetails.StudentScore" } } }
   ]
);

このように、$avgは配列や埋め込みドキュメント内のフィールドにも直接適用できるため、複雑な集計処理でもシンプルな記述で実現できるのが魅力です。データ分析やレポート生成など、さまざまなシーンで活用してみてください。

  1. 【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方

    MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド

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

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