MongoDBでサブドキュメント内のフィールド値を合計する方法
MongoDBでは、アグリゲーションフレームワーク(aggregate)を使用することで、ネストされたサブドキュメント内のフィールド値を簡単に合計できます。本記事では、具体的なサンプルコードとともに、その手順をわかりやすく解説します。
1. サンプルコレクションの作成
まず、サブドキュメントを含むドキュメントを持つコレクションを作成します。以下の例では、顧客の購入金額が「CustomerDetails」→「CustomerPurchase」→「CustomerPurchaseAmount」という階層構造で格納されています。
> db.summingSubDocumentDemo.insertOne(
... { "_id" :101, "CustomerDetails" : { "CustomerPurchase" : { "CustomerPurchaseAmount" : 2000 } } });
{ "acknowledged" : true, "insertedId" : 101 }
> db.summingSubDocumentDemo.insertOne( { "_id" :102, "CustomerDetails" : { "CustomerPurchase" : { "CustomerPurchaseAmount" : 3000 } } });
{ "acknowledged" : true, "insertedId" : 102 }
> db.summingSubDocumentDemo.insertOne( { "_id" :103, "CustomerDetails" : { "CustomerPurchase" : { "CustomerPurchaseAmount" : 5000 } } });
{ "acknowledged" : true, "insertedId" : 103 }2. 登録したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.summingSubDocumentDemo.find().pretty();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : 101,
"CustomerDetails" : {
"CustomerPurchase" : {
"CustomerPurchaseAmount" : 2000
}
}
}
{
"_id" : 102,
"CustomerDetails" : {
"CustomerPurchase" : {
"CustomerPurchaseAmount" : 3000
}
}
}
{
"_id" : 103,
"CustomerDetails" : {
"CustomerPurchase" : {
"CustomerPurchaseAmount" : 5000
}
}
}3. アグリゲーションでフィールド値を合計する
それでは、サブドキュメント内の「CustomerPurchaseAmount」フィールドを合計するクエリを見ていきましょう。ポイントは以下の2つです。
- $group: ドキュメントを単一のグループにまとめます(_idに空文字を指定して全体を1グループ化)。
- $sum: グループ内の指定フィールドの合計値を計算します。パスはドット記法($CustomerDetails.CustomerPurchase.CustomerPurchaseAmount)で指定します。
> db.summingSubDocumentDemo.aggregate({$group : {_id: "",
... totalAmount : {$sum: "$CustomerDetails.CustomerPurchase.CustomerPurchaseAmount"}}},
... {$project: {_id: 0, totalAmount: 1}});このクエリを実行すると、以下のように合計金額が出力されます。
{ "totalAmount" : 10000 }まとめ
このように、MongoDBのアグリゲーションパイプラインを使えば、$groupと$sumを組み合わせることで、深くネストされたサブドキュメントのフィールド値も容易に集計できます。$projectステージを追加することで、不要な_idフィールドを除外し、結果を見やすく整形できるのもポイントです。売上集計や統計処理など、実務でも頻繁に活用できるテクニックなので、ぜひ覚えておきましょう。
-
MongoDBの$project演算子でフィールドを射影(プロジェクション)する方法
MongoDBの集計パイプライン(aggregation pipeline)において、ドキュメントから特定のフィールドを射影(プロジェクション)して出力形式を整形したい場合は、$project ステージを使用します。$project を使うと、表示するフィールドの選択だけでなく、$cond や $ifNull などの演算子を組み合わせて、条件に応じた値の変換や代替値の設定も可能です。この記事では、実際にコレクションを作成し、$project を使ってネストされたフィールドを条件付きで射影する方法を解説します。1. サンプルコレクションの作成まず、insertOne() メソッドを使って、ドキュ
-
MongoDBの_idフィールドを非表示にする方法
MongoDBの_idフィールドを非表示にする方法MongoDBでは、find()メソッドでドキュメントを検索すると、デフォルトで_idフィールド(ObjectId)が必ず結果に含まれます。しかし、射影(プロジェクション)という仕組みを使えば、この_idフィールドを非表示にし、必要なフィールドだけを取得することが可能です。本記事では、具体的な手順をサンプルコード付きで解説します。1. コレクションとドキュメントの作成まず、サンプル用のコレクションを作成し、ドキュメントを挿入します。> db.demo575.insertOne({id:101, Information:{Name:&quo