MongoDBのaggregateで$sum演算子を使って合計件数・合計値を取得する方法
MongoDBで合計を集計して総数や合計値を取得するには、集計フレームワーク(Aggregation Pipeline)の$sum演算子を使用します。$sumは、$groupステージと組み合わせることで、ドキュメントの件数カウントや特定フィールドの合計計算を簡単に行えます。
ここでは、実際にコレクションを作成しながら、具体的な使い方を解説していきます。
1. サンプルコレクションの作成
まず、動作確認用にドキュメントを挿入してコレクションを作成します。
> db.aggregateSumDemo.insertOne({"CustomerName":"Larry","Amount":140});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8baa0680f10143d8431e18")
}
> db.aggregateSumDemo.insertOne({"CustomerName":"Mike","Amount":160});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8baa1380f10143d8431e19")
}
> db.aggregateSumDemo.insertOne({"CustomerName":"Sam","Amount":300});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8baa1c80f10143d8431e1a")
}
> db.aggregateSumDemo.insertOne({"CustomerName":"David","Amount":500});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c8baa2580f10143d8431e1b")
}2. 登録したドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。クエリは以下の通りです。
> db.aggregateSumDemo.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5c8baa0680f10143d8431e18"),
"CustomerName" : "Larry",
"Amount" : 140
}
{
"_id" : ObjectId("5c8baa1380f10143d8431e19"),
"CustomerName" : "Mike",
"Amount" : 160
}
{
"_id" : ObjectId("5c8baa1c80f10143d8431e1a"),
"CustomerName" : "Sam",
"Amount" : 300
}
{
"_id" : ObjectId("5c8baa2580f10143d8431e1b"),
"CustomerName" : "David",
"Amount" : 500
}4件のドキュメントが登録されていることが確認できました。それでは、このコレクションに対して集計を行っていきましょう。
3. 【ケース1】合計件数(TotalCount)を取得する
ドキュメントの総件数を取得するには、$groupで_id: null(全ドキュメントを1つのグループにまとめる)を指定し、$sumに1を設定します。$sum: 1 は「ドキュメント1件につき1を加算する」ことを意味するため、結果として全体の件数が求められます。
クエリは以下の通りです。
> db.aggregateSumDemo.aggregate([ {
$group: {
_id: null,
"TotalCount": {
$sum: 1
}
}
} ] );実行結果は次のようになります。
{ "_id" : null, "TotalCount" : 4 }登録されている4件のドキュメント数が正しく取得できました。
4. 【ケース2】数値フィールドの合計値(TotalAmount)を取得する
次に、「Amount」フィールドの合計金額を求めます。今度は$sumにフィールド名($Amount)を指定します。これにより、各ドキュメントのAmountの値が順に加算されていきます。
クエリは以下の通りです。
> db.aggregateSumDemo.aggregate([ {
$group: {
_id: null,
"TotalAmount": {
$sum: "$Amount"
}
}
} ] );実行結果は次のようになります。
{ "_id" : null, "TotalAmount" : 1100 }140 + 160 + 300 + 500 = 1100 となり、Amountフィールドの合計値が正しく計算されています。
まとめ
- $sum: 1 → ドキュメントの総件数をカウントできる
- $sum: "$フィールド名" → 指定した数値フィールドの合計値を計算できる
- どちらの場合も、
$groupの_idをnullにすることでコレクション全体を対象に集計できる
このように、MongoDBの集計フレームワークと$sum演算子を組み合わせれば、SQLのSUM()やCOUNT()に相当する処理をシンプルなパイプラインで実現できます。条件を絞りたい場合は、パイプラインの先頭に$matchステージを追加するだけで対応可能です。
-
MongoDBの$unwind演算子でカウントを取得する方法
MongoDBの$unwindは、入力ドキュメント内の配列フィールドを分解し、配列の各要素に対して1つのドキュメントを出力する集計演算子です。この$unwindをaggregate()メソッドと組み合わせることで、要素ごとのカウントを効率的に取得できます。本記事では、実際にコレクションを作成し、$unwindと$groupを組み合わせて年齢別のカウントを求める手順を解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。以下の例では、「Details」フィールドの中に「Information」という配列を持つドキュメントを挿入しています。配列内には「Name」が
-
MongoDB集計パイプラインで重複するNameフィールド値ごとの出現回数を取得する方法
MongoDBでは、$unwindと$groupを組み合わせた集計(アグリゲーション)パイプラインを使うことで、配列内に存在する重複したフィールド値を名前ごとにグループ化し、それぞれの出現回数を簡単に取得できます。ここでは、具体的な例をもとにその手順を解説します。サンプルコレクションの作成まずは、ドキュメントを含むコレクションを作成してみましょう。以下の例では、demo558というコレクションに、国コードと複数人の受講科目情報を持つドキュメントを挿入します。> db.demo558.insertOne( ... { ... _id : 100, ... CountryCode