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

MongoDB集計フレームワークの$groupを使ったグループ化クエリの実例解説

MongoDB集計フレームワークにおける$group演算子の使い方

MongoDBの集計(Aggregation)フレームワークでは、$groupステージを使用することで、ドキュメントを指定したキーごとにグループ化し、合計や平均などの集計処理を行うことができます。本記事では、実際のコード例を通じて$groupの基本的な使い方をわかりやすく解説します。

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

まずは、動作確認用のコレクションを作成し、ドキュメントを挿入します。以下の例では「demo639」というコレクションに、国名と2つの情報オブジェクト(Info1・Info2)を持つドキュメントを登録しています。

> db.demo639.insertOne(
...     {
...        "_id" : 1,
...        "CountryName" : "US",
...        "Info1" : {
...           "Name" : "Chris",
...           "SubjectName" : "MySQL",
...           "Marks" : 78
...        },
...        "Info2" : {
...           "Name" : "Chris",
...           "SubjectName" : "MySQL",
...           "Marks" : 78
...        }
...     }
... );
{ "acknowledged" : true, "insertedId" : 1 }

続けて、2件目のドキュメントも挿入します。こちらは国名が「UK」で、Info1とInfo2の点数(Marks)が異なるデータになっています。

> db.demo639.insertOne(
... {
...    "_id" : 2,
...    "CountryName" : "UK",
...    "Info1" : {
...       "Name" : "Chris",
...       "SubjectName" : "MySQL",
...       "Marks" : 79
...    },
...    "Info2" : {
...           "Name" : "Chris",
...           "SubjectName" : "MySQL",
...           "Marks" : 88
...        }
...    }
... );
{ "acknowledged" : true, "insertedId" : 2 }

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

挿入したすべてのドキュメントを確認するには、find()メソッドを使用します。

> db.demo639.find();

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

{ "_id" : 1, "CountryName" : "US", "Info1" : { "Name" : "Chris", "SubjectName" : "MySQL", "Marks" : 78 }, "Info2" : { "Name" : "Chris", "SubjectName" : "MySQL", "Marks" : 78 } }
{ "_id" : 2, "CountryName" : "UK", "Info1" : { "Name" : "Chris", "SubjectName" : "MySQL", "Marks" : 79 }, "Info2" : { "Name" : "Chris", "SubjectName" : "MySQL", "Marks" : 88 } }

3. $groupを使った集計クエリの実行

ここからが本題です。集計フレームワークのaggregate()メソッド内で$groupを使用し、「Info1.Name」と「Info2.Name」の組み合わせをグループ化キーとして指定します。さらに、累積演算子$sumを使ってInfo2の点数(Marks)の合計を算出しています。

> db.demo639.aggregate({$group : {_id : {Name1:"$Info1.Name",Name2:"$Info2.Name"},
...
...    Marks:{$first:"$Info2.Marks"},
...    Marks:{$sum:"$Info2.Marks"}
... }}).pretty();

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

{ "_id" : { "Name1" : "Chris", "Name2" : "Chris" }, "Marks" : 166 }

4. 結果のポイント

この出力から読み取れるポイントは以下の通りです。

  • _idフィールド: グループ化の基準となった「Name1」と「Name2」の値が格納されています。両方とも「Chris」であるため、2つのドキュメントは同じグループにまとめられています。
  • Marksフィールド: $sum演算子により、各グループ内のInfo2.Marksの合計値が計算されています。具体的には「78 + 88 = 166」となっています。

なお、サンプルクエリ内では同じ「Marks」フィールドに対して$firstと$sumの両方を指定していますが、後から指定された$sumが有効になります。意図しない動作を避けるため、実際の開発では異なるフィールド名を使用するか、不要な演算子を削除することをおすすめします。

まとめ

$groupステージは、SQLのGROUP BY句に相当する機能であり、MongoDBでのデータ集計において最も重要な演算子の一つです。_idにグループ化キーを指定し、$sumや$avg、$maxなどの累積演算子と組み合わせることで、柔軟な集計処理を実現できます。ネストされたドキュメントのフィールドも「$Info1.Name」のようにパス形式で参照できるため、複雑なデータ構造でも問題なくグループ化できます。

  1. MongoDBで_idを使ってグループ化するクエリの書き方

    MongoDBでドキュメントをグループ化するには、集計パイプライン(aggregation pipeline)の $group ステージを使用します。この記事では、実際にコレクションを作成し、$group を使ってデータを集計する手順を具体的な例とともに解説します。 サンプルコレクションの作成 まずは、動作確認用のコレクションにドキュメントを挿入してみましょう。以下のように insertOne() メソッドを使って、スコア情報を持つドキュメントを複数件登録します。 > db.demo529.insertOne({Score:10}); { acknowledged : true

  2. MongoDBの集計フレームワークで特定のフィールド値に一致するドキュメントを取得する方法

    MongoDBで特定のフィールド値に一致するドキュメントを抽出したい場合は、集計フレームワーク(Aggregation Framework)の $match ステージを使用します。この記事では、実際にコレクションを作成しながら、$match を使った条件一致と、$group を組み合わせた件数集計の手順を解説します。1. サンプルコレクションの作成まず、insertOne() メソッドを使って、複数のドキュメントを含むコレクションを作成します。> db.demo555.insertOne({CountryName:US});{ acknowledged : true, inser