MongoDBで集計関数を実装するアグリゲーションクエリの書き方
MongoDBでは、アグリゲーションフレームワークを利用することで、SQLの集計関数に相当する処理を柔軟に実装できます。本記事では、サンプルコレクションを作成し、$match・$unwind・$groupなどのステージを組み合わせた集計クエリの実行方法を、手順を追って解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使って、配列フィールド「Details」を持つドキュメントを含むコレクションを作成します。
> db.demo121.insertOne(
... {
... "Id" : 101,
... "Details" : [
... {
... "SubjectId" : "1",
... "SubjectName" : "MongoDB",
... "Score" : 76
... },
... {
... "SubjectId" : "2",
... "SubjectName" : "MySQL",
... "Score" : 76
... },
... {
... "SubjectId" : "3",
... "SubjectName" : "Java",
... "Score" : 76
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e2f1c60140daf4c2a3544b3")
}2. 登録したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo121.find();
実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5e2f1c60140daf4c2a3544b3"), "Id" : 101, "Details" : [
{ "SubjectId" : "1", "SubjectName" : "MongoDB", "Score" : 76 },
{ "SubjectId" : "2", "SubjectName" : "MySQL", "Score" : 76 },
{ "SubjectId" : "3", "SubjectName" : "Java", "Score" : 76 }
]
}3. 集計関数(アグリゲーション)を実装するクエリ
続いて、aggregate()メソッドを使って集計処理を実行します。このクエリでは、「Id」が101のドキュメントを抽出し、Details配列を展開したうえで、科目IDごとにグループ化して結果を整形しています。
> db.demo121.aggregate([
... { "$match": { "Id": 101 } },
... { "$unwind": "$Details" },
... {
... "$group": {
... "_id": "$Details.SubjectId",
... "count": { "$sum": 1 },
... "Details": {
... "$push": {
... "SubjectName": "$Details.SubjectName"
... }
... }
... }
... },
... {
... "$group": {
... "_id": null,
... "List": {
... "$push": {
... "SubId": "$_id",
... "Details": "$Details"
... }
... }
... }
... }
... ], function (err, out) {
... res.json(out);
... });パイプラインの各ステージの役割
- $match:条件に一致するドキュメントのみを抽出します。ここでは「Id」が101のドキュメントを対象としています。
- $unwind:配列フィールド「Details」を要素ごとに個別のドキュメントへ展開します。
- $group(1つ目):SubjectIdごとにドキュメントをグループ化し、$sumで件数をカウント、$pushで科目名を配列にまとめます。
- $group(2つ目):すべてのグループを単一の結果セットにまとめ、「List」フィールドとして整理して出力します。
4. 実行結果
クエリを実行すると、SubjectIdごとに整理された次のような結果が得られます。
{
"_id" : null, "List" : [
{ "SubId" : "3", "Details" : [ { "SubjectName" : "Java" } ] },
{ "SubId" : "2", "Details" : [ { "SubjectName" : "MySQL" } ] },
{ "SubId" : "1", "Details" : [ { "SubjectName" : "MongoDB" } ] }
]
}まとめ
MongoDBのアグリゲーションパイプラインを使えば、配列データの展開からグループ化、件数の集計までを一連の流れで処理できます。特に$matchと$unwindを組み合わせれば、ネストされた配列データも柔軟に集計できるため、複雑なドキュメント構造を扱う際にとても便利です。ぜひ実際の開発でも活用してみてください。
-
MongoDBで配列フィールドに対して$in演算子を使ったクエリを実装する方法
MongoDBの$in演算子とはMongoDBの$in演算子を使うと、指定した配列内のいずれかの値に一致するドキュメントを検索できます。配列型のフィールドに対して$inを使用すると、その配列の要素に指定値が1つでも含まれていれば、該当するドキュメントとして取得されます。この記事では、実際にコレクションを作成し、配列フィールド「ListOfName」に対して$inクエリを実行する手順を解説します。ドキュメントを含むコレクションの作成まず、ドキュメントを挿入してコレクションを作成しましょう。以下のようにinsertOne()メソッドを使用します。> db.demo520.insertOne(
-
MongoDBの集計パイプラインで$matchと$projectを使う方法
MongoDBの集計(アグリゲーション)パイプラインにおいて、$match と $project は最もよく使われるステージの2つです。それぞれの役割を理解しておくことで、柔軟なデータ処理が可能になります。$matchと$projectの基本$match は、指定した条件に一致するドキュメントだけをフィルタリングし、次のパイプラインステージへ渡す役割を持ちます。SQLのWHERE句に相当する機能です。$project は、次のステージへ渡すドキュメントから、必要なフィールドだけを選択・整形する役割を持ちます。SQLのSELECT句のようなイメージです。サンプルコレクションの作成それでは、実際に