MongoDBでサブドキュメント内の全フィールドを合計する方法
MongoDBでサブドキュメント(配列内のドキュメント)に含まれる数値フィールドをすべて合計したい場合は、アグリゲーションフレームワークを使用します。$unwindで配列を展開し、$groupと$sumを組み合わせることで合計値を算出できます。
まずは、実際に動作を確認するためのコレクションを作成しましょう。
1. サンプルコレクションの作成
insertOne()メソッドを使って、プレイヤー情報を持つドキュメントを挿入します。
> db.sumEveryFieldDemo.insertOne(
... {
... "_id":101,
... "PlayerDetails": [
... {"PlayerName":"John","PlayerScore":1000},
... {"PlayerName":"Carol","PlayerScore":2000},
... {"PlayerName":"Sam","PlayerScore":3000}
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }2. 登録されたドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.sumEveryFieldDemo.find().pretty();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : 101,
"PlayerDetails" : [
{
"PlayerName" : "John",
"PlayerScore" : 1000
},
{
"PlayerName" : "Carol",
"PlayerScore" : 2000
},
{
"PlayerName" : "Sam",
"PlayerScore" : 3000
}
]
}3. アグリゲーションでフィールドを合計する
それでは、サブドキュメント内の「PlayerScore」フィールドをすべて合計するクエリを見てみましょう。ポイントは以下の2つのステージです。
- $unwind: 「PlayerDetails」配列を展開し、各要素を個別のドキュメントとして扱えるようにします。
- $group + $sum: 「_id」でグループ化しながら、「PlayerDetails.PlayerScore」の合計を計算します。
> db.sumEveryFieldDemo.aggregate( [
... { $unwind: "$PlayerDetails" },
... { $group: {
... _id: '$_id',
... sum: { $sum: '$PlayerDetails.PlayerScore' }
... } }
... ] ).pretty();このクエリを実行すると、次の出力が得られます。
{ "_id" : 101, "sum" : 6000 }結果として、「_id: 101」のドキュメントに含まれる3人のプレイヤーのスコア(1000 + 2000 + 3000)が合計され、6000という値が返されました。
まとめ
配列形式のサブドキュメント内の数値フィールドを合計する場合は、$unwindで配列を展開してから、$groupと$sumで集計するのが基本の流れです。このパターンは、売上集計やスコア集計など、さまざまな場面で応用できるので、ぜひ覚えておきましょう。
-
MongoDBでドキュメントフィールドの値から別の値(TotalPrice − Discount)を差し引いて計算する方法
MongoDBでは、aggregate()内の $subtract 演算子を使うことで、ドキュメントフィールドの値から別のフィールドの値を差し引いた結果を計算できます。例えば、総額(TotalPrice)から割引額(DiscountPrice)を引いた実質価格を求めるようなケースに便利です。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下のコマンドでコレクションにドキュメントを挿入します。> db.demo599.insertOne({TotalPrice:250,DiscountPrice:35});{ ackno
-
特定のフィールドが存在しないMongoDBドキュメントを取得する方法
MongoDBでは、$exists演算子を使用して特定のフィールドの有無を確認できます。ドキュメント内に目的のフィールドが存在しない場合、そのドキュメントをfind()やアグリゲーション(集計)パイプラインで取得して表示することが可能です。本記事では、配列内のサブドキュメントに特定のフィールド(例:Age)が含まれていないドキュメントを抽出する方法を、具体的なサンプルコードとともに解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下の例では、demo612というコレクションにドキュメントを挿入しています。> db.demo612.insertO