MongoDBで特定フィールドの値を合計するクエリの書き方(aggregate + $sum)
MongoDBでは、aggregate()メソッドと$group・$sum演算子を組み合わせることで、コレクション内のドキュメントに含まれる特定フィールドの値を簡単に合計できます。この記事では、実際のコマンド例を使いながら手順をわかりやすく解説します。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成します。ここではdemo677というコレクションに、Valueフィールドを持つ4件のドキュメントを挿入します。
> db.demo677.insertOne({Value:10});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea421f404263e90dac943f8")
}
> db.demo677.insertOne({Value:50});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea421f704263e90dac943f9")
}
> db.demo677.insertOne({Value:20});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea421fa04263e90dac943fa")
}
> db.demo677.insertOne({Value:20});
{
"acknowledged" : true,
"insertedId" : ObjectId("5ea421fe04263e90dac943fb")
}2. 挿入したドキュメントの確認
find()メソッドを使用すると、コレクション内のすべてのドキュメントを表示できます。
> db.demo677.find();
実行すると、以下のような出力が得られます。
{ "_id" : ObjectId("5ea421f404263e90dac943f8"), "Value" : 10 }
{ "_id" : ObjectId("5ea421f704263e90dac943f9"), "Value" : 50 }
{ "_id" : ObjectId("5ea421fa04263e90dac943fa"), "Value" : 20 }
{ "_id" : ObjectId("5ea421fe04263e90dac943fb"), "Value" : 20 }3. 特定フィールドの値を合計するクエリ
それでは、Valueフィールドの値を合計してみましょう。ポイントは、_idにnullを指定することです。これにより、すべてのドキュメントが単一のグループとして扱われ、コレクション全体の合計値を算出できます。
> db.demo677.aggregate({ $group: { _id : null, sum : { $sum: "$Value" } } });実行結果は以下の通りです。
{ "_id" : null, "sum" : 100 }クエリのポイント解説
- $group: ドキュメントを指定したキーでグループ化するステージです。
_id: nullを指定すると全ドキュメントが1つのグループになります。 - $sum: グループ内の数値を合計する集計演算子です。
"$Value"のようにフィールド名を参照することで、そのフィールドの値の総和を計算します。 - 応用:
_idに特定のフィールド(例:"$category")を指定すれば、カテゴリごとの合計値なども簡単に求められます。
このように、MongoDBのアグリゲーションフレームワークを使えば、SQLのSUM()関数と同様の集計処理を柔軟に実現できます。売上データの集計や統計処理など、さまざまな場面で活用できるので、ぜひ覚えておきましょう。
-
【MongoDB】$addFieldsで新しいフィールドを追加し、価格を特定の数値で割った結果を連結する方法
MongoDBで既存のドキュメントに新しいフィールドを追加するには、集計パイプラインの$addFieldsステージを使用します。本記事では、ネストされた配列内の商品価格(ProductPrice)を特定の数値で割り、その結果を文字列として連結して新しいフィールドに格納する方法を、サンプルコードとともに解説します。 サンプルコレクションの作成 まず、insertOne()メソッドを使用して、ドキュメントを含むコレクションを作成します。 > db.demo719.insertOne( ... { ... Number:7374644, ... de
-
MongoDBでフィールド値に含まれる「@email」のような文字列を検索する方法
MongoDBのfind()メソッドを使えば、正規表現(Regex)を活用して、フィールド値の中から特定の文字列を柔軟に検索できます。本記事では、「@email」という文字列を含むドキュメントを検索する方法を、実際のコード例とともに解説します。1. 検索用コレクションの作成まずは、メールアドレスを格納したドキュメントを持つコレクションを作成しましょう。> db.demo727.insertOne({UserId:John@email.com}); { acknowledged : true, insertedId : ObjectId(5eab375f4341781127