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

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

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

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

まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成します。

> db.demo598.insertOne(
...    {
...       Information:'Student',
...       id:100,
...       details:[
...          {Name:'Chris',Marks:75},
...          {Name:'Bob',Marks:55}
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e947fccf5f1e70e134e2694")
}
> db.demo598.insertOne(
...    {
...       Information:'Student',
...       id:101,
...       details:[
...          {Name:'Chris',Marks:75},
...          {Name:'Bob',Marks:45}
...       ]
...    }
... );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e947fcdf5f1e70e134e2695")
}

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

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

> db.demo598.find();

上記のコマンドを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e947fccf5f1e70e134e2694"), "Information" : "Student", "id" : 100, "details" : [
   { "Name" : "Chris", "Marks" : 75 },
   { "Name" : "Bob", "Marks" : 55 }
] }
{ "_id" : ObjectId("5e947fcdf5f1e70e134e2695"), "Information" : "Student", "id" : 101, "details" : [
   { "Name" : "Chris", "Marks" : 75 },
   { "Name" : "Bob", "Marks" : 45 }
] }

ドキュメントと配列要素の平均を取得するクエリ

以下は、ドキュメントのフィールド(id)と、details配列内の各要素(Marks)それぞれの平均値を取得するための集計クエリです。

> db.demo598.aggregate([
...
...    { "$group": {
...       "_id": "Information",
...       "id": { "$avg": "$id" },
...       "details": { "$push": "$details" }
...    }},
...    { "$unwind": "$details" },
...    { "$unwind": "$details" },
...    { "$group": {
...       "_id": { "Information": "$_id", "Name": "$details.Name" },
...       "id": { "$avg": "$id" },
...       "AvgValue": { "$avg": "$details.Marks" }
...    }},
...    { "$sort": { "_id": 1 } },
...    { "$group": {
...       "_id": "$_id.Information",
...       "id": { "$avg": "$id" },
...       "details": { "$push": {
...          "Name": "$_id.Name",
...          "MarksAvg": "$AvgValue"
...       }}
...    }}
... ]).pretty();

パイプラインの処理内容

  • $group(1回目):Informationフィールドをキーにグループ化し、idの平均値を計算するとともに、details配列をまとめます。
  • $unwind(2回):ネストされたdetails配列を段階的に展開し、個々の要素(NameとMarks)を扱えるようにします。
  • $group(2回目):InformationとNameの組み合わせごとにグループ化し、idの平均と、各NameにおけるMarksの平均(AvgValue)を算出します。
  • $sort:結果を_id順に並べ替えます。
  • $group(3回目):Information単位で再度グループ化し、名前ごとの平均点をdetails配列として再構成します。

実行結果

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

{
   "_id" : "Information",
   "id" : 100.5,
   "details" : [
      {
         "Name" : "Bob",
         "MarksAvg" : 50
      },
      {
         "Name" : "Chris",
         "MarksAvg" : 75
      }
   ]
}

このように、idの平均は100.5、BobのMarks平均は50、ChrisのMarks平均は75として正しく集計されています。$group$unwindを組み合わせることで、ネストされた配列データも柔軟に集計できるのがポイントです。

  1. MongoDBで配列要素の平均値を取得するクエリの書き方

    MongoDBで配列内の数値の平均を求める方法MongoDBでは、配列に格納された複数の数値から平均値を算出したいケースがよくあります。例えば、1つのドキュメントの中に複数の点数(Marks)が配列として保存されている場合、その平均点を取得したいことがあります。このような場合、集計パイプライン(aggregation)と$avg演算子を組み合わせることで、簡単に平均値を求めることができます。$avgは、指定したフィールド(配列の場合はその全要素)の数値の平均を自動的に計算してくれる便利な演算子です。以下、具体的な手順を見ていきましょう。1. コレクションを作成し、ドキュメントを挿入するまず、i

  2. MongoDBで特定フィールドの配列要素数を取得する方法($size演算子の使い方)

    MongoDBでドキュメント内の特定フィールド(配列)に含まれる要素の数をカウントしたい場合は、集計パイプライン(aggregate)と$size演算子を組み合わせるのが最も簡単な方法です。この記事では、実際のコレクションを作成しながら、配列要素数を取得する具体的な手順を解説します。1. サンプルコレクションの作成まず、配列型のフィールド「Subject」を持つドキュメントを含むコレクションを作成します。> db.demo723.insertOne({Subject:[MySQL,MongoDB]}); { acknowledged : true, insertedId