MongoDBの$sum演算子で合計値を1つのグループに集約する方法
MongoDBの$sum演算子で合計値を1つのグループに集約する方法
MongoDBで合計値を集約するには、アグリゲーションフレームワークの$sum演算子を使用します。$sumは$groupステージと組み合わせることで、単純な合計だけでなく、条件に応じたカウントや合計も柔軟に計算できます。
まず、サンプル用のコレクションにドキュメントを作成してみましょう。
> db.demo406.insertOne({"Score":35});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e6f99d5fac4d418a0178599")
}
> db.demo406.insertOne({"Score":55});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e6f99d8fac4d418a017859a")
}
> db.demo406.insertOne({"Score":35});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e6f99dcfac4d418a017859b")
}
> db.demo406.insertOne({"Score":45});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e6f99defac4d418a017859c")
}
> db.demo406.insertOne({"Score":65});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e6f99e3fac4d418a017859d")
}
> db.demo406.insertOne({"Score":45});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e6f99e6fac4d418a017859e")
}作成したドキュメントの確認
find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。
> db.demo406.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e6f99d5fac4d418a0178599"), "Score" : 35 }
{ "_id" : ObjectId("5e6f99d8fac4d418a017859a"), "Score" : 55 }
{ "_id" : ObjectId("5e6f99dcfac4d418a017859b"), "Score" : 35 }
{ "_id" : ObjectId("5e6f99defac4d418a017859c"), "Score" : 45 }
{ "_id" : ObjectId("5e6f99e3fac4d418a017859d"), "Score" : 65 }
{ "_id" : ObjectId("5e6f99e6fac4d418a017859e"), "Score" : 45 }合計を1つのグループに集約するクエリ
以下は、$groupと$sum、$condを組み合わせて、合計を1つのグループに集約するクエリの例です。
> db.demo406.aggregate([
... { "$group": {
... "_id": null,
... "Score1": {
... "$sum": {
... "$cond": [{ "$eq": [ "$Score", 35 ] }, 1, 0 ]
... }
... },
... "Score2": {
... "$sum": {
... "$cond": [{ "$ne": [ "$Score", 35 ] }, 1, 0 ]
... }
... },
... "Score3": {
... "$sum": {
... "$cond": [{ "$ne": [ "$Score", 59 ] }, "$Score", 0 ]
... }
... }
... }}
... ])このクエリでは、次の3つの集計を同時に実行しています。
- Score1: Scoreが35と等しいドキュメントの件数をカウント($eqで条件判定)
- Score2: Scoreが35と等しくないドキュメントの件数をカウント($neで条件判定)
- Score3: Scoreが59と等しくないドキュメントのScore値を合計(条件を満たさない場合は0を加算)
実行すると、次のような結果が出力されます。
{ "_id" : null, "Score1" : 2, "Score2" : 4, "Score3" : 280 }この結果から、Scoreが35のドキュメントは2件、35以外のドキュメントは4件、Scoreが59以外のドキュメントの合計値は280であることがわかります。なお、_idがnullになっているのは、$groupの_idにnullを指定することで、コレクション内のすべてのドキュメントを1つのグループとして扱っているためです。
このように$sumと$condを組み合わせれば、単一の集計パイプラインで複数の条件付き集計を効率的に実行できます。売上データの集計やログ解析など、さまざまなシーンで応用できるテクニックなので、ぜひ覚えておきましょう。
-
MongoDBのaggregateで$groupを使って複数の集計結果を一度に取得する方法
MongoDBでは、$facetと$groupを組み合わせることで、1回のaggregateクエリで複数の集計結果を同時に取得できます。この記事では、実際のコード例を通じてその方法を解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下のようにinsertOne()メソッドを使ってデータを挿入します。> db.demo765.insertOne( ... { ... Name:John, ... Category:ComputerScience, ... SubjectName:MongoDB,
-
MongoDBで1つのクエリを使って複数のドキュメントを一括更新する方法(bulkWrite活用ガイド)
MongoDBで1つのクエリで複数のドキュメントを更新するには?MongoDBで1回のリクエスト(1つのクエリ)で複数のドキュメントを効率的に更新したい場合は、bulkWrite()メソッドを使用します。bulkWrite()は、複数の書き込み操作(insert、update、deleteなど)をまとめてサーバーに送信できるため、個別にクエリを発行するよりもパフォーマンス面で優れています。ここでは、updateOne操作を組み合わせて、複数のドキュメントのフィールドを一度に更新する手順を具体的に解説します。1. コレクションの作成とドキュメントの挿入まず、insertOne()メソッドを使って