MongoDBでは、$sum 集計パイプライン演算子は、数値の合計を計算して返します。
構文
$sum 演算子は2つの構文をサポートします。
構文1:
{ $sum: <expression> } 構文2:
{ $sum: [ <expression1>, <expression2> ... ] } 最初の構文は1つの引数を受け入れ、2番目の構文は複数の引数を受け入れます。
$groupで使用する場合 ステージでは、最初の構文のみを使用できます。この場合、$sum 同じgroupbyキーを共有するドキュメントのグループ内の各ドキュメントに、指定された式を適用した結果のすべての数値の合計を返します。
構文1の例(単一引数)
構文1を使用する例をいくつか示します。
グループ化されたドキュメント
この例では、$sumを使用しています $groupと組み合わせて キーでグループ化されたドキュメントのグループ全体の合計を返します。
petsというコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 }
{ "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 }
{ "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 }
{ "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 }
{ "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }
これらのドキュメントをtypeでグループ化できます フィールドをクリックし、$sumを使用します weightの合計を返す 各グループのフィールド:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
sum: { $sum: "$weight" }
}
}
]
) 結果:
{ "_id" : "Kangaroo", "sum" : 430 }
{ "_id" : "Cat", "sum" : 27 }
{ "_id" : "Dog", "sum" : 60 } 配列
この例では、$sumを適用します 値の配列を持つフィールドを含む単一のドキュメントに。
このオプションは、単一引数構文を使用する場合にのみ使用できます。マルチ引数構文を使用する場合、配列は無視されます(これについては以下で詳しく説明します)。
playersというコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "player" : "Homer", "scores" : [ 1, 7, 2, 3, 8, 7, 1 ] }
{ "_id" : 2, "player" : "Marge", "scores" : [ 0, 1, 8, 17, 18, 8 ] }
{ "_id" : 3, "player" : "Bart", "scores" : [ 15, 11, 8, 0, 1, 3 ] }
{ "_id" : 4, "player" : "Brian", "scores" : [ 7 ] }
{ "_id" : 5, "player" : "Farnsworth", "scores" : [ ] }
{ "_id" : 6, "player" : "Meg", "scores" : null }
{ "_id" : 7, "player" : "Ron" }
$sumを適用できます scoresに 各ドキュメントのフィールド:
db.players.aggregate(
[
{
$project:
{
player: 1,
sum: { $sum: "$scores" }
}
}
]
) 結果:
{ "_id" : 1, "player" : "Homer", "sum" : 29 }
{ "_id" : 2, "player" : "Marge", "sum" : 52 }
{ "_id" : 3, "player" : "Bart", "sum" : 38 }
{ "_id" : 4, "player" : "Brian", "sum" : 7 }
{ "_id" : 5, "player" : "Farnsworth", "sum" : 0 }
{ "_id" : 6, "player" : "Meg", "sum" : 0 }
{ "_id" : 7, "player" : "Ron", "sum" : 0 } この場合、最初の4つのドキュメントは、それぞれの配列にあったさまざまな数値の合計を返しました。
ドキュメント4の場合、配列には1つの番号しかなかったため、これは番号と同じでした。
ドキュメント5が0を返しました 空の配列を提供したためです。
ドキュメント6が0を返しました nullを提供したため 引数として。
ドキュメント7が0を返しました フィールドさえ存在しなかったからです。
構文2の例(複数の引数)
2番目の構文には、$sumの提供が含まれます。 複数の引数があります。 $sum 次に、指定されたすべての引数に基づいて合計を計算します。
dataというコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
{ "_id" : 2, "a" : 1, "b" : 2, "c" : 3, "d" : [ 4 ] }
{ "_id" : 3, "a" : 1, "b" : 2, "c" : 3, "d" : "Hey" }
{ "_id" : 4, "a" : "One", "b" : "Two", "c" : "Three", "d" : "Four" }
$sumを使用できます aの合計を返す 、b 、c 、およびd 各ドキュメントのフィールド:
db.data.aggregate(
[
{
$project:
{
sum: { $sum: [ "$a", "$b", "$c", "$d" ] }
}
}
]
) 結果:
{ "_id" : 1, "sum" : 10 }
{ "_id" : 2, "sum" : 6 }
{ "_id" : 3, "sum" : 6 }
{ "_id" : 4, "sum" : 0 }
ドキュメント1は、1の入力値の合計を返します 、2 、3 、および4 。
ただし、次の2つのドキュメントは、1の入力値の合計のみを返しました。 、2 、および3 。 $sum オペレーターはdを無視しました 田畑。
これは、$sumが原因です。 数値以外の値を無視します。したがって、この場合は"Hey"を無視しました ドキュメント3で、残りの(数値)フィールドから合計を計算しました。
ドキュメント2については、そのd フィールドに配列が含まれています。前述のように、$sum マルチ引数構文を使用する場合、演算子は配列を無視します。より正確には、このコンテキストで使用される場合、配列を非数値として扱い、$sum 数値以外の値を無視します。
すべての値が数値以外の場合、$sum 0を返します 。これはドキュメント4で確認できます。
欠落しているフィールド
複数引数の構文を使用する場合は、$sum 欠落しているフィールドはすべて無視されます。つまり、存在しないフィールドを指定すると、それは無視されます。フィールドが存在しない場合は、0を返します。 。
例:
db.data.aggregate(
[
{
$project:
{
sum: { $sum: [ "$a", "$b", "$c", "$d", "$e" ] }
}
}
]
) 結果:
{ "_id" : 1, "sum" : 10 }
{ "_id" : 2, "sum" : 6 }
{ "_id" : 3, "sum" : 6 }
{ "_id" : 4, "sum" : 0 }
この場合、追加のフィールド($e)を提供しました )ドキュメントには存在しません。 $sum 実行する残りのフィールドに基づいて合計を計算しました 存在します。
ただし、なしの場合は次のようになります 存在するフィールドの数:
db.data.aggregate(
[
{
$project:
{
result: { $sum: [ "$x", "$y", "$z" ] }
}
}
]
) 結果:
{ "_id" : 1, "result" : 0 }
{ "_id" : 2, "result" : 0 }
{ "_id" : 3, "result" : 0 }
{ "_id" : 4, "result" : 0 }
結果は0です すべてのドキュメントに対して。
前に見たように、単一引数の構文を使用する場合、フィールドが欠落していると、0になります。 。
例:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
sum: { $sum: "$oops!" }
}
}
]
) 結果:
{ "_id" : "Cat", "sum" : 0 }
{ "_id" : "Dog", "sum" : 0 }
{ "_id" : "Kangaroo", "sum" : 0 } 利用可能なステージ
$sum 次の段階で利用できます:
-
$group -
$project -
$addFields -
$set -
$replaceRoot -
$replaceWith -
$match$exprを含むステージ 表現