MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

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_idnullにすることでコレクション全体を対象に集計できる

このように、MongoDBの集計フレームワークと$sum演算子を組み合わせれば、SQLのSUM()やCOUNT()に相当する処理をシンプルなパイプラインで実現できます。条件を絞りたい場合は、パイプラインの先頭に$matchステージを追加するだけで対応可能です。

  1. MongoDBの$unwind演算子でカウントを取得する方法

    MongoDBの$unwindは、入力ドキュメント内の配列フィールドを分解し、配列の各要素に対して1つのドキュメントを出力する集計演算子です。この$unwindをaggregate()メソッドと組み合わせることで、要素ごとのカウントを効率的に取得できます。本記事では、実際にコレクションを作成し、$unwindと$groupを組み合わせて年齢別のカウントを求める手順を解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。以下の例では、「Details」フィールドの中に「Information」という配列を持つドキュメントを挿入しています。配列内には「Name」が

  2. MongoDB集計パイプラインで重複するNameフィールド値ごとの出現回数を取得する方法

    MongoDBでは、$unwindと$groupを組み合わせた集計(アグリゲーション)パイプラインを使うことで、配列内に存在する重複したフィールド値を名前ごとにグループ化し、それぞれの出現回数を簡単に取得できます。ここでは、具体的な例をもとにその手順を解説します。サンプルコレクションの作成まずは、ドキュメントを含むコレクションを作成してみましょう。以下の例では、demo558というコレクションに、国コードと複数人の受講科目情報を持つドキュメントを挿入します。> db.demo558.insertOne( ... { ... _id : 100, ... CountryCode