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

MongoDBで特定のフィールドを合計する方法:aggregateと$sumの使い方を解説

MongoDBで特定のフィールドの合計値を求めるには、aggregate(集計パイプライン)$sum演算子を組み合わせて使用します。この記事では、実際のコレクションを作成しながら、ステータスで絞り込んだ上でフィールドを合計する手順を詳しく解説します。

1. サンプルコレクションの作成

まず、insertOne()メソッドを使ってドキュメントを含むコレクションを作成します。

> db.getSumOfFieldsDemo.insertOne({"Customer_Id":101,"Price":50,"Status":"Active"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e06cec29e4dae213890ac55")
}
> db.getSumOfFieldsDemo.insertOne({"Customer_Id":102,"Price":200,"Status":"Inactive"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e06ced19e4dae213890ac56")
}
> db.getSumOfFieldsDemo.insertOne({"Customer_Id":101,"Price":3000,"Status":"Active"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e06cedd9e4dae213890ac57")
}
> db.getSumOfFieldsDemo.insertOne({"Customer_Id":103,"Price":400,"Status":"Active"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e06cee79e4dae213890ac58")
}

このコレクションには、顧客ID(Customer_Id)、価格(Price)、ステータス(Status)の3つのフィールドを持つ4件のドキュメントが格納されています。

2. 登録されたドキュメントの確認

find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。

> db.getSumOfFieldsDemo.find().pretty();

上記のクエリを実行すると、次のような出力が得られます。

{
   "_id" : ObjectId("5e06cec29e4dae213890ac55"),
   "Customer_Id" : 101,
   "Price" : 50,
   "Status" : "Active"
}
{
   "_id" : ObjectId("5e06ced19e4dae213890ac56"),
   "Customer_Id" : 102,
   "Price" : 200,
   "Status" : "Inactive"
}
{
   "_id" : ObjectId("5e06cedd9e4dae213890ac57"),
   "Customer_Id" : 101,
   "Price" : 3000,
   "Status" : "Active"
}
{
   "_id" : ObjectId("5e06cee79e4dae213890ac58"),
   "Customer_Id" : 103,
   "Price" : 400,
   "Status" : "Active"
}

3. aggregateと$sumで特定のフィールドを合計する

それでは本題です。以下は、「Active」ステータスのドキュメントに絞り込んだ上で、顧客IDごとにPriceフィールドを合計するクエリです。

> db.getSumOfFieldsDemo.aggregate([ { $match: { Status: "Active" } }, { $group: { _id: "$Customer_Id", TotalSum: { $sum: "$Price" } } } ]);

実行結果は次のとおりです。

{ "_id" : 103, "TotalSum" : 400 }
{ "_id" : 101, "TotalSum" : 3050 }

クエリの仕組み

この集計パイプラインは、次の3つのステージで構成されています。

$match: Statusが「Active」のドキュメントだけを抽出します。この例では「Inactive」の顧客ID 102のドキュメントが除外されます。
$group: Customer_Idごとにドキュメントをグループ化します。
$sum: 各グループ内のPriceの合計値を計算し、TotalSumというフィールドに出力します。

その結果、顧客ID 101の合計は 50 + 3000 = 3050、顧客ID 103の合計は 400 となり、正しく集計されていることが確認できます。

まとめ

MongoDBでフィールドの合計を求める場合は、aggregateのパイプライン内で$matchによる絞り込み、$groupによるグループ化、$sumによる合計計算を組み合わせるのが基本のパターンです。条件を変えれば、ステータスや期間などさまざまな条件での集計にも応用できます。

  1. MongoDBのクエリで特定のフィールド(列)だけを取得する方法

    MongoDBで特定のフィールド(列)のみを取得したい場合、プロジェクション(projection)を使用します。プロジェクションでは、表示したいフィールドに 1 を、非表示にしたいフィールドに 0 を指定することで、取得するデータを制御できます。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。> db.demo415.insertOne({ClientName:Robert,ClientCountryName:US}); { acknowledged : true, insertedId : ObjectId(5e72329db912067e

  2. MongoDBで配列をクエリして特定の値を取得する方法

    配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ...    { ...        "details": [ ...            { ...                "