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を展開し、要素ごとに個別のドキュメントを作成します。 - $match:
Branchが「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 で展開してから条件絞込みを行うのがポイントです。
-
MongoDBの集約(Aggregation)と投影(Projection)の使い方を解説
MongoDBの集約と投影とはMongoDBで特定のフィールドだけを抽出しながらデータを加工したい場合、aggregate()メソッドと$projectステージを組み合わせるのが効果的です。$projectは、パイプライン内で指定されたフィールドを持つドキュメントだけを次のステージへ渡す役割を果たします。この記事では、実際にコレクションを作成し、$match・$unwind・$sort・$group・$projectを組み合わせた集約パイプラインの具体的な使い方を解説します。サンプルコレクションの作成まず、insertOne()を使ってドキュメントを含むコレクションを作成します。> db
-
MySQLのIN()演算子を使ってLastNameを条件にレコードを取得する方法
MySQLのIN()演算子とはMySQLのIN()演算子を使うと、WHERE句で複数の値を指定し、いずれかに一致するレコードを効率的に取得できます。例えば、姓(LastName)が「Smith」「Brown」「Miller」のいずれかに該当するデータだけを抽出したい場合などに非常に便利です。この記事では、実際にテーブルを作成し、IN()演算子を使ってLastNameを条件にレコードを取得する手順を解説します。1. テーブルを作成するまず、以下のコマンドでテーブルを作成します。mysql> create table DemoTable ( FirstName varchar(100