MongoDB集計入門:$groupで同じIDを持つ製品価格を合計する方法
はじめに
MongoDBで、同じID(Product_Id)を持つ複数のドキュメントの価格を合計したい場合は、集計パイプライン(aggregation pipeline)の $group ステージを使用します。_id にグループ化のキーとなる式を指定し、$sum 演算子と組み合わせることで、グループごとの合計値を簡単に求められます。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。ここでは「aggregateDemo」というコレクションに4つのドキュメントを挿入します。
> db.aggregateDemo.insertOne({"Product_Id":1,"ProductPrice":50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06d3c025ddae1f53b621d9")
}
> db.aggregateDemo.insertOne({"Product_Id":2,"ProductPrice":100});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06d3c625ddae1f53b621da")
}
> db.aggregateDemo.insertOne({"Product_Id":2,"ProductPrice":500});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06d3cb25ddae1f53b621db")
}
> db.aggregateDemo.insertOne({"Product_Id":1,"ProductPrice":150});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e06d3d125ddae1f53b621dc")
}
登録済みドキュメントの確認
find() メソッドを使えば、コレクション内のすべてのドキュメントを表示できます。
> db.aggregateDemo.find().pretty();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e06d3c025ddae1f53b621d9"),
"Product_Id" : 1,
"ProductPrice" : 50
}
{
"_id" : ObjectId("5e06d3c625ddae1f53b621da"),
"Product_Id" : 2,
"ProductPrice" : 100
}
{
"_id" : ObjectId("5e06d3cb25ddae1f53b621db"),
"Product_Id" : 2,
"ProductPrice" : 500
}
{
"_id" : ObjectId("5e06d3d125ddae1f53b621dc"),
"Product_Id" : 1,
"ProductPrice" : 150
}
このように、同じ Product_Id を持つドキュメントが複数存在していることが確認できます。
$groupによる集計で価格を合計する
それでは、$Product_Id をグループ化のキーとして指定し、$sum で ProductPrice を合計する集計クエリを見ていきましょう。
> db.aggregateDemo.aggregate([
... {
... $group: {
... _id: "$Product_Id",
... TotalValue: {$sum: "$ProductPrice"}
... }
... }
... ]
... );
このクエリを実行すると、次のような出力が得られます。
{ "_id" : 2, "TotalValue" : 600 }
{ "_id" : 1, "TotalValue" : 200 }
結果の読み方
出力結果を見ると、Product_Id が 1 のグループでは 50 + 150 = 200、Product_Id が 2 のグループでは 100 + 500 = 600 となっており、同じIDを持つドキュメントの価格が正しく合計されていることがわかります。なお、$group の結果が出力される順序は保証されないため、必要に応じて $sort ステージを組み合わせるとよいでしょう。
まとめ
$group ステージの _id にグループ化のキーとなるフィールドを指定し、$sum を使うことで、同一IDを持つドキュメントの数値フィールドを簡単に合計できます。売上集計や在庫管理など、実務のさまざまなシーンで役立つ基本的かつ強力なテクニックなので、ぜひマスターしておきましょう。
-
【MongoDB】aggregate()と$groupで異なるドキュメント内の同じIDを持つ要素を集約する方法
複数のドキュメントにまたがって同じIDを持つ要素をグループ化したい場合には、MongoDBの aggregate() メソッドと $group ステージを組み合わせるのが効果的です。本記事では、実際にサンプルコレクションを作成しながら、IDごとにドキュメントを集約する手順をわかりやすく解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成し、ドキュメントを挿入していきます。ここでは「id」と「Name」というフィールドを持つドキュメントを6件登録します。> db.demo602.insertOne({id:1,Name:"Chris"});{
-
MongoDBの集計パイプラインで複数フィールドをカウントする方法($facet活用)
MongoDBで複数のフィールドごとにドキュメントをカウントしたい場合、$facet演算子を使うのが効果的です。$facetは、同じ入力ドキュメント群に対して、単一のステージ内で複数の集計パイプラインを同時に処理できる強力な機能です。この記事では、実際にコレクションを作成し、$facetを組み合わせた集計クエリで複数フィールドの値をカウントする手順を解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使ってサンプルドキュメントを挿入します。各ドキュメントにはdetails1・details2・details3という3つのネストされたフィールドを持たせます。>