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

MongoDBの集約パイプライン(Aggregation Pipeline)を使ってレコードを取得する方法

集約パイプラインとは

MongoDBの集約パイプライン(Aggregation Pipeline)は、複数の「ステージ」で構成されるデータ処理の仕組みです。ドキュメントはパイプラインを通過する際に、各ステージで順番に変換されていきます。代表的なステージには、配列を展開する $unwind、条件に合うドキュメントを絞り込む $match、グループ化を行う $group などがあります。

この記事では、集約パイプラインを使用してMongoDBから特定の条件に合致するレコードを取得する手順を、実際のコード例とともに解説します。

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

まず、ドキュメントを含むコレクションを作成します。以下の例では、学生の名前・学部・点数の配列を持つドキュメントを insertOne() メソッドで挿入しています。

> db.demo218.insertOne({"Name":"Chris","Branch":"CS",Marks:[65,78,36,90]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3e5f4903d395bdc2134712")
}
> db.demo218.insertOne({"Name":"David","Branch":"ME",Marks:[56,45,42,51]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3e5f6203d395bdc2134713")
}
> db.demo218.insertOne({"Name":"Chris","Branch":"CS",Marks:[78,65,89]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3e5f6c03d395bdc2134714")
}

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

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

> db.demo218.find();

上記のクエリを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e3e5f4903d395bdc2134712"), "Name" : "Chris", "Branch" : "CS", "Marks" : [ 65, 78, 36, 90 ] }
{ "_id" : ObjectId("5e3e5f6203d395bdc2134713"), "Name" : "David", "Branch" : "ME", "Marks" : [ 56, 45, 42, 51 ] }
{ "_id" : ObjectId("5e3e5f6c03d395bdc2134714"), "Name" : "Chris", "Branch" : "CS", "Marks" : [ 78, 65, 89 ] }

集約パイプラインによるレコードの取得

ここからが本題です。以下のクエリでは、aggregate() メソッドに3つのステージを渡して集約処理を行っています。

> db.demo218.aggregate([
...   { "$unwind": "$Marks" },
...   { "$match":
...      {
...        "Branch": "CS",
...        "Marks": { "$gt": 88 }
...      }
...   },
...   { "$group":
...      {
...        "_id": "$_id",
...        "Branch": { "$first": "$Branch" },
...        "Marks": { "$first": "$Marks" }
...      }
...   }
...])

各ステージの処理内容

  • $unwind:配列フィールド Marks を展開し、要素ごとに個別のドキュメントを作成します。
  • $matchBranch が「CS」であり、かつ Marks が88より大きいドキュメントのみを抽出します。
  • $group_id ごとにグループ化し、$first 演算子を使って各グループの最初の値を取得します。

実行結果

このクエリを実行すると、次の出力が得られます。

{ "_id" : ObjectId("5e3e5f6c03d395bdc2134714"), "Branch" : "CS", "Marks" : 89 }
{ "_id" : ObjectId("5e3e5f4903d395bdc2134712"), "Branch" : "CS", "Marks" : 90 }

まとめ

このように、集約パイプラインでは $unwind$match$group といったステージを組み合わせることで、「CS学部の学生の中から88点を超える点数を持つレコード」を柔軟に抽出できます。配列フィールドを扱う際は $unwind で展開してから条件絞込みを行うのがポイントです。

  1. MongoDBの集約(Aggregation)と投影(Projection)の使い方を解説

    MongoDBの集約と投影とはMongoDBで特定のフィールドだけを抽出しながらデータを加工したい場合、aggregate()メソッドと$projectステージを組み合わせるのが効果的です。$projectは、パイプライン内で指定されたフィールドを持つドキュメントだけを次のステージへ渡す役割を果たします。この記事では、実際にコレクションを作成し、$match・$unwind・$sort・$group・$projectを組み合わせた集約パイプラインの具体的な使い方を解説します。サンプルコレクションの作成まず、insertOne()を使ってドキュメントを含むコレクションを作成します。> db

  2. MySQLのIN()演算子を使ってLastNameを条件にレコードを取得する方法

    MySQLのIN()演算子とはMySQLのIN()演算子を使うと、WHERE句で複数の値を指定し、いずれかに一致するレコードを効率的に取得できます。例えば、姓(LastName)が「Smith」「Brown」「Miller」のいずれかに該当するデータだけを抽出したい場合などに非常に便利です。この記事では、実際にテーブルを作成し、IN()演算子を使ってLastNameを条件にレコードを取得する手順を解説します。1. テーブルを作成するまず、以下のコマンドでテーブルを作成します。mysql> create table DemoTable ( FirstName varchar(100