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

配列値に基づいて集計し、MongoDBドキュメントの値を合計する方法

MongoDBで配列内の値に基づいてデータを集計し、複数のドキュメントにまたがる数値を合計したい場合には、aggregate()メソッドを使用します。この記事では、実際のコード例を通じて、$unwindと$groupを組み合わせた集計の手順をわかりやすく解説します。

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

まず、ドキュメントを含むコレクションを作成しましょう。以下の例では、学生の詳細情報(StudentDetails)の中に、名前(Name)とスコア(Score)を持つ配列(OtherDetails)が格納されたドキュメントを挿入しています。

> db.demo126.insertOne(
...    {
...       "StudentDetails" : {
...          "Number" : 1,
...          "OtherDetails" : [
...          {
...                "Name" : "Chris",
...                "Score" : 55
...          }
...    ].. }}
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e304b3068e7f832db1a7f56")
}
>
>
> db.demo126.insertOne(
...    {
...       "StudentDetails" : {
...
...          "Number" : 2,
...          "OtherDetails" : [
...             {
...                 "Name" : "Chris",
...                 "Score" : 35
...
...             },
...             {
...                 "Name" : "David",
...                 "Score" : 87
...             }
...
...          ]
...       }}
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e304b3068e7f832db1a7f57")
}

挿入したドキュメントの確認

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

> db.demo126.find();

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

{ "_id" : ObjectId("5e304b3068e7f832db1a7f56"), "StudentDetails" : { "Number" : 1, "OtherDetails" : [ { "Name" : "Chris", "Score" : 55 } ] } }
{ "_id" : ObjectId("5e304b3068e7f832db1a7f57"), "StudentDetails" : { "Number" : 2, "OtherDetails" : [ { "Name" : "Chris", "Score" : 35 }, { "Name" : "David", "Score" : 87 } ] } }

配列値に基づく集計クエリ

ここからが本題です。配列の値に基づいて集計を行うには、以下のようにaggregate()パイプラインを構築します。

> db.demo126.aggregate([
...    {
...       $unwind:"$StudentDetails.OtherDetails"
...    },
...    {
...       $group:{
...          _id:"$StudentDetails.OtherDetails.Name",
...          quantity:{
...          $sum:"$StudentDetails.OtherDetails.Score"
...          }
...       }
...    }
... ])

クエリのポイント

  • $unwind: 配列フィールド「OtherDetails」を展開し、各要素を個別のドキュメントとして扱えるようにします。これにより、配列内の各項目に対して集計処理を適用できます。
  • $group: 「Name」フィールドをグループ化のキーとして指定し、$sum演算子によって「Score」の合計値を計算します。

実行結果

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

{ "_id" : "David", "quantity" : 87 }
{ "_id" : "Chris", "quantity" : 90 }

この結果を見ると、Chrisのスコアは最初のドキュメントの55と2番目のドキュメントの35を合わせた90、Davidのスコアは87となっています。このように、異なるドキュメントに分散している配列要素の値も、$unwindと$groupを組み合わせることで簡単に合計できます。配列データを扱う集計処理において、非常に便利なテクニックなので、ぜひ活用してください。

  1. 【MongoDB】特定のフィールドの値に基づいて配列内のドキュメントをカウントする方法

    MongoDBで配列内のドキュメントを条件付きでカウントする方法 MongoDBで、配列内の特定のフィールドの値に一致するドキュメントをカウントしたい場合は、集計パイプライン(Aggregation Pipeline)の $match ステージを使用します。本記事では、$unwind → $match → $group という流れで、配列要素を展開し、条件に合致するものだけを抽出してカウントする手順をサンプルコード付きで解説します。 1. サンプルコレクションの作成 まず、ドキュメントを含むコレクションを作成しましょう。 > db.demo726.insertOne( ...  

  2. MongoDBでnull値を除外してドキュメントを取得する方法($ne演算子の使い方)

    MongoDBでコレクション内のnull値を無視(除外)してドキュメントを取得したい場合、aggregate()の中で「$ne : null」を使用します。この記事では、実際にサンプルコレクションを作成し、null値を除外するクエリの書き方をステップごとに解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使って、配列フィールドに空文字・通常の文字列・nullが混在したドキュメントを持つコレクションを作成します。 > db.demo722.insertOne( ... { ... id:101, ... detail