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

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で集計するのが基本の流れです。このパターンは、売上集計やスコア集計など、さまざまな場面で応用できるので、ぜひ覚えておきましょう。

  1. MongoDBでドキュメントフィールドの値から別の値(TotalPrice − Discount)を差し引いて計算する方法

    MongoDBでは、aggregate()内の $subtract 演算子を使うことで、ドキュメントフィールドの値から別のフィールドの値を差し引いた結果を計算できます。例えば、総額(TotalPrice)から割引額(DiscountPrice)を引いた実質価格を求めるようなケースに便利です。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下のコマンドでコレクションにドキュメントを挿入します。> db.demo599.insertOne({TotalPrice:250,DiscountPrice:35});{    ackno

  2. 特定のフィールドが存在しないMongoDBドキュメントを取得する方法

    MongoDBでは、$exists演算子を使用して特定のフィールドの有無を確認できます。ドキュメント内に目的のフィールドが存在しない場合、そのドキュメントをfind()やアグリゲーション(集計)パイプラインで取得して表示することが可能です。本記事では、配列内のサブドキュメントに特定のフィールド(例:Age)が含まれていないドキュメントを抽出する方法を、具体的なサンプルコードとともに解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下の例では、demo612というコレクションにドキュメントを挿入しています。> db.demo612.insertO