MongoDBアグリゲーションで配列内の要素サブセットを合計する方法
MongoDBのアグリゲーションパイプラインを使用して、配列内の一部の要素(サブセット)を合計したい場合があります。そんなときは、$first演算子と$sum演算子を組み合わせることで実現できます。
この記事では、実際のコレクションを作成しながら、具体的な手順をサンプルコード付きでわかりやすく解説します。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。以下の例では、数値の配列「Values」を持つドキュメントをinsertOne()メソッドで挿入しています。
> db.demo610.insertOne({Values:[10,20,30,40,50]});{
"acknowledged" : true, "insertedId" : ObjectId("5e9747b8f57d0dc0b182d62e")
}2. ドキュメントの内容を確認する
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo610.find().pretty()
上記のコマンドを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e9747b8f57d0dc0b182d62e"),
"Values" : [
10,
20,
30,
40,
50
]
}3. 配列のサブセットを合計するアグリゲーションクエリ
それでは、配列内の要素のうち、先頭の値を除いた残りの要素を合計するクエリを見ていきましょう。処理の流れは以下の通りです。
- $unwind: 配列「Values」を個々のドキュメントに展開します。
- $group:
$firstで先頭の値を取得し、$sumで全要素の合計を計算します。 - $project:
$subtractを使って「全体の合計 − 先頭の値」を算出します。 - $group: 最終的な合計値をまとめます。
> db.demo610.aggregate([
... {$unwind:"$Values"},
... {$group:{"_id":"$_id",
... "1st":{$first:"$Values"},
... "All":{$sum:"$Values"}}},
... {$project:{"_id":"$_id",
... "SumOfAllMinus1":{$subtract:["$All","$1st"]}}},
... {$group:{"_id":null,
... "SumOfAllExcept1stValue":{$sum:"$SumOfAllMinus1"}}}
... ])4. 実行結果
上記のパイプラインを実行すると、次のような出力が得られます。
{ "_id" : null, "SumOfAllExcept1stValue" : 140 }元の配列は [10, 20, 30, 40, 50] で、全体の合計は150です。そこから先頭の値である10を差し引いたため、結果として140が出力されました。
まとめ
このように、$unwindで配列を展開したうえで、$firstと$sum、さらに$subtractを組み合わせることで、配列内の任意のサブセット(この例では先頭以外の要素)を柔軟に合計できます。条件を変えれば、末尾の要素を除外したり、特定の位置の要素だけを集計したりすることも可能です。データ分析やレポート作成の際にぜひ活用してみてください。
-
MongoDBの集計(アグリゲーション)で配列要素を最大値と照合してグループ化する方法
MongoDBで、配列内の要素をその配列の最大値と照合し、結果をグループ化して集計したいケースはよくあります。そのような場合は、$groupと$maxを組み合わせた集計パイプライン(アグリゲーションフレームワーク)を使用します。ここでは、サンプルコレクションを作成しながら、具体的な手順をわかりやすく解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使って、detailsという配列フィールド(NameとScoreを持つオブジェクトのリスト)を含むドキュメントを3件挿入します。 > db.demo510.insertOne( ... { ... &nb
-
C#の既存ジャグ配列に要素を追加する方法
C#において、既存のジャグ配列(Jagged Array:配列の配列)に要素を追加・更新するのはとても簡単です。対象となるインデックスを指定し、そこに新しい値を代入するだけで完了します。 例えば、次の位置にある要素に新しい値を設定したいケースを考えてみましょう。 x[3][1] この場合、以下のように値を代入します。 x[3][1] = 500; 上記のコードでは、ジャグ配列内の4番目の配列(インデックス3)が持つ2番目の要素(インデックス1)にアクセスし、値を書き換えています。 サンプルコード それでは、ジャグ配列の宣言から要素の更新、そして結果の表示までを行う完全なサンプルコードを見てみま