定義
特定のウィンドウ内のドキュメントから数値の合計を返します。
注意
$sum のその他の用途
このページでは、ウィンドウ関数として使用する場合の$sum について説明します。
次の他のコンテキストでは $sum を使用することもできます。
$sum (accumulator)は、ドキュメントのグループ全体の数値の合計を返します。$sum (expression)は、配列内の数値の合計を返します。
構文
{ $setWindowFields: { ... output: { <field>: { $sum: <expression> } } } }
動作
結果の型
入力型が混在している場合、$sum は小さい入力型を 2 つのうち大きい方にプロモートします。型は、より幅広い値を表す場合、より大きな値と見なされます。数値型の最小値から最大値の順は、integer → long → double → decimal です。
演算がオーバーフローして、大きい方のデータ型で表される範囲を超えない限り、大きい方の入力型によって結果型も決まります。オーバーフローの場合、$sum は以下の順序に従って結果を昇格させます。
NULL または欠損値
ウィンドウ内のドキュメントの一部のドキュメントで、フィールドの値が null であるか、フィールドが欠落している場合、$sum はそれらの値を無視し、残りの 値を合計します。
nullウィンドウ内のすべてのドキュメントで、フィールドの値が であるか、フィールドが欠落している場合、$sum は0 を返します。
例
このページの例では、 sample_mflix データセット のデータを使用します。このデータセットを自己管理型MongoDBデプロイにロードする 方法の詳細については、「 サンプル データセットをロードする 」を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
この例では、$setWindowFields 2009を使用して、 と2010 から各ビジュアル映画の実行中の累積投票合計を計算します。各ドキュメントには、年ごとのパーティションの先頭から現在のドキュメントまで計算された$sum 値が含まれます。
db.movies.aggregate( [ { $match: { genres: "Musical", year: { $in: [ 2009, 2010 ] }, "imdb.rating": { $type: "double" }, "imdb.votes": { $gt: 0 } } }, { $setWindowFields: { partitionBy: "$year", sortBy: { title: 1 }, output: { cumulativeVotesInYear: { $sum: "$imdb.votes", window: { documents: [ "unbounded", "current" ] } }, rankInYear: { $documentNumber: {} } } } }, { $project: { _id: 0, title: 1, year: 1, "imdb.votes": 1, cumulativeVotesInYear: 1, rankInYear: 1 } }, { $sort: { year: 1, title: 1 } } ] )
先行するパイプライン:
$match20092010を使用して、数値 IMDb 評価と少なくとも 1 票を持つ と のビジュアル映画をフィルタリングします。$setWindowFieldsを使用して、映画を で分割し、yeartitleでソートします。ステージでは、$sumと[ "unbounded", "current" ]のドキュメントウィンドウを使用して、各ドキュメントごとに次のフィールドを作成します。cumulativeVotesInYear:imdb.votesの実行中の累積合計。rankInYear:$documentNumberによって割り当てられたパーティションごとの行番号。
$projecttitleを使用して、 、year、imdb.votes、cumulativeVotesInYear、rankInYearを出力に含めます。$sort結果を年とタイトルで並べ替えるには、 を使用します。