MongoDBの集計(Aggregation)で特定のドキュメントの合計値を計算する方法
MongoDB集計で合計値を計算する基本
MongoDBで数値の合計を求めるには、集計(Aggregation)フレームワークの$sum演算子を使用します。さらに、特定の条件に一致するドキュメントだけを対象に合計を計算したい場合は、$groupステージでドキュメントをグループ化することがポイントになります。
ステップ1:サンプルコレクションの作成
まずは動作確認用のコレクションを作成し、ドキュメントを挿入しましょう。以下の例では、ユーザーリスト(ListOfUsers)と、各ユーザーの「いいね」数(TotalLikes)を格納した配列(UsersDetails)を持つドキュメントを2件登録しています。
> db.calculateSumOfDocument.insertOne({"ListOfUsers":["Carol","Bob"],"UsersDetails":[{"FirstUser":"Carol","TotalLikes":20},{"FirstUser":"Bob","TotalLikes":45}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e084e9125ddae1f53b6220c")
}
> db.calculateSumOfDocument.insertOne({"ListOfUsers":["Carol","Bob"],"UsersDetails":[{"FirstUser":"Carol","TotalLikes":60},{"FirstUser":"Bob","TotalLikes":50}]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e084f6125ddae1f53b6220d")
}
ステップ2:登録済みドキュメントの確認
find()メソッドにpretty()を組み合わせて実行すると、コレクション内のすべてのドキュメントを整形して表示できます。
> db.calculateSumOfDocument.find().pretty();
上記のクエリを実行すると、以下のような出力が得られます。
{
"_id" : ObjectId("5e084e9125ddae1f53b6220c"),
"ListOfUsers" : [
"Carol",
"Bob"
],
"UsersDetails" : [
{
"FirstUser" : "Carol",
"TotalLikes" : 20
},
{
"FirstUser" : "Bob",
"TotalLikes" : 45
}
]
}
{
"_id" : ObjectId("5e084f6125ddae1f53b6220d"),
"ListOfUsers" : [
"Carol",
"Bob"
],
"UsersDetails" : [
{
"FirstUser" : "Carol",
"TotalLikes" : 60
},
{
"FirstUser" : "Bob",
"TotalLikes" : 50
}
]
}
ステップ3:集計パイプラインで特定ユーザーの合計を計算する
いよいよ本題です。次の例では、aggregate()メソッドを使って「Carol」のTotalLikesの合計を計算しています。各ステージの役割は以下のとおりです。
- $match(1回目):条件に一致するドキュメントを事前に絞り込み、後続の処理量を減らす
- $unwind:配列フィールド UsersDetails を1要素=1ドキュメントに展開する
- $match(2回目):展開後の要素から Carol のデータのみを抽出する
- $group + $sum:_id を null にして全ドキュメントを1つのグループとみなし、TotalLikes を合算する
> db.calculateSumOfDocument.aggregate([
... {
... "$match": { "UsersDetails.FirstUser": "Carol" }
... },
... { "$unwind" : "$UsersDetails" },
... {
... "$match": { "UsersDetails.FirstUser": "Carol" }
... },
... {
... "$group": {
... "_id": null,
... "total": { "$sum": "$UsersDetails.TotalLikes" }
... }
... }
... ]);
実行結果
{ "_id" : null, "total" : 80 }
_idがnullになっているのは、$groupステージで null を指定したことで、すべてのドキュメントが1つのグループとして扱われているためです。total の「80」は、CarolのTotalLikes(20 + 60)を合計した結果です。
まとめ
MongoDBで特定のドキュメントの合計値を求めるときは、「$match → $unwind → $match → $group($sum)」という流れのパイプラインを組み立てます。特に配列内の特定の要素だけを集計したい場合は、$unwindの前後で$matchを実行することで、正確かつ効率的に目的の合計を取得できます。この手法は、いいね数や売上金額など、ネストされた配列データの統計処理にも幅広く応用できます。
-
MongoDBシェルで特定の値を持つドキュメントを取得する方法をわかりやすく解説
MongoDBシェルを使って特定の値を持つアイテムを取得する方法MongoDBで特定の値を持つドキュメントを取得したい場合、find()メソッドを使用するのが基本です。この記事では、サンプルコレクションを作成し、実際にfind()メソッドを使って条件に合うデータを抽出する手順を詳しく解説します。1. サンプルコレクションの作成まずはinsertOne()メソッドを使って、テスト用のコレクション「demo563」に複数のドキュメントを挿入します。> db.demo563.insertOne({Name:Chris,Age:21,isMarried:true}){ acknowled
-
MongoDBの集約(Aggregation)で特定のフィールド値を持つドキュメントを取得する方法
特定の条件に一致するドキュメントを取得したい場合には、aggregate() メソッドを使用します。ここでは、フィールド「Age」の値が「21」であるドキュメントを取得するケースを例に解説します。 サンプルコレクションの作成 まずは、ドキュメントを含むコレクションを作成しましょう。 > db.demo685.insertOne( ... { ... details: ... [ ... { ... Name:Chris, ... Age:21 ... }, ..