Di MongoDB, $sum
operator pipeline agregasi menghitung dan mengembalikan jumlah nilai numerik.
Sintaks
$sum
operator mendukung dua sintaks.
Sintaks 1
{ $sum: <expression> }
Sintaks 2:
{ $sum: [ <expression1>, <expression2> ... ] }
Sintaks pertama menerima satu argumen dan sintaks kedua menerima beberapa argumen.
Saat digunakan di $group
tahap, Anda hanya dapat menggunakan sintaks pertama. Dalam hal ini, $sum
mengembalikan jumlah kolektif dari semua nilai numerik yang dihasilkan dari penerapan ekspresi yang ditentukan ke setiap dokumen dalam grup dokumen yang berbagi grup yang sama berdasarkan kunci.
Contoh Sintaks 1 (Argumen Tunggal)
Berikut adalah beberapa contoh yang menggunakan sintaks 1.
Dokumen yang Dikelompokkan
Contoh ini menggunakan $sum
dalam hubungannya dengan $group
untuk mengembalikan jumlah di seluruh grup dokumen yang dikelompokkan berdasarkan kunci.
Misalkan kita memiliki koleksi yang disebut pets
dengan dokumen sebagai berikut:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Anjing", "berat" :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" :"Anjing", "berat" :30 }
Kami dapat mengelompokkan dokumen-dokumen ini berdasarkan type
bidang, lalu gunakan $sum
untuk mengembalikan jumlah weight
kolom untuk setiap grup:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
sum: { $sum: "$weight" }
}
}
]
)
Hasil:
{ "_id" :"Kanguru", "jumlah" :430 }{ "_id" :"Kucing", "jumlah" :27 }{ "_id" :"Anjing", "jumlah" :60 }Array
Contoh ini berlaku
$sum
ke satu dokumen yang berisi bidang dengan larik nilai.Opsi ini hanya tersedia saat menggunakan sintaks argumen tunggal. Array diabaikan saat menggunakan sintaks multi-argumen (lebih lanjut tentang ini di bawah).
Misalkan kita memiliki koleksi yang disebut
players
dengan dokumen sebagai berikut:{ "_id" :1, "player" :"Homer", "skor" :[ 1, 7, 2, 3, 8, 7, 1 ] }{ "_id" :2, "player" :" Marge", "skor" :[ 0, 1, 8, 17, 18, 8 ] }{ "_id" :3, "pemain" :"Bart", "skor" :[ 15, 11, 8, 0, 1 , 3 ] }{ "_id" :4, "player" :"Brian", "skor" :[ 7 ] }{ "_id" :5, "player" :"Farnsworth", "skor" :[ ] }{ "_id" :6, "player" :"Meg", "skor" :null }{ "_id" :7, "player" :"Ron" }Kami dapat menerapkan
$sum
kescores
kolom di setiap dokumen:db.players.aggregate( [ { $project: { player: 1, sum: { $sum: "$scores" } } } ] )
Hasil:
{ "_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 }Dalam hal ini, empat dokumen pertama mengembalikan jumlah dari berbagai angka yang ada dalam lariknya masing-masing.
Dalam kasus dokumen 4, ini sama dengan angka, karena hanya ada satu angka dalam larik.
Dokumen 5 mengembalikan
0
karena kami menyediakan array kosong.Dokumen 6 mengembalikan
0
karena kami menyediakannull
sebagai argumen.Dokumen 7 mengembalikan
0
karena bidangnya bahkan tidak ada.Contoh Sintaks 2 (Beberapa Argumen)
Sintaks kedua melibatkan penyediaan
$sum
dengan lebih dari satu argumen.$sum
kemudian menghitung jumlah berdasarkan semua argumen yang diberikan.Misalkan kita memiliki koleksi yang disebut
data
dengan dokumen sebagai berikut:{ "_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" :"Hei" } { "_id" :4, "a" :"Satu", "b" :"Dua", "c" :"Tiga", "d" :"Empat" }Kita bisa menggunakan
$sum
untuk mengembalikan jumlaha
,b
,c
, dand
bidang setiap dokumen:db.data.aggregate( [ { $project: { sum: { $sum: [ "$a", "$b", "$c", "$d" ] } } } ] )
Hasil:
{ "_id" :1, "sum" :10 }{ "_id" :2, "sum" :6 }{ "_id" :3, "sum" :6 }{ "_id" :4, " jumlah" :0 }Dokumen 1 mengembalikan jumlah nilai input
1
,2
,3
, dan4
.Namun, dua dokumen berikutnya hanya mengembalikan jumlah nilai input
1
,2
, dan3
.$sum
operator mengabaikand
. mereka bidang.Ini karena
$sum
mengabaikan nilai non-numerik. Jadi dalam hal ini mengabaikan"Hey"
dalam dokumen 3 dan menghitung jumlah dari bidang (numerik) yang tersisa.Sedangkan untuk dokumen 2,
d
bidang berisi array. Seperti disebutkan,$sum
operator mengabaikan array saat menggunakan sintaks multi-argumen. Lebih tepatnya, ini memperlakukan array sebagai nilai non-numerik saat digunakan dalam konteks ini, dan$sum
mengabaikan nilai non-numerik.Jika semua nilai non-numerik, maka
$sum
mengembalikan0
. Kita dapat melihat ini dengan dokumen 4.Bidang Tidak Ada
Saat menggunakan sintaks multi-argumen,
$sum
mengabaikan bidang yang hilang. Artinya, jika Anda menyediakan bidang yang tidak ada, itu akan mengabaikannya. Jika tidak ada bidang yang ada, maka akan mengembalikan0
.Contoh:
db.data.aggregate( [ { $project: { sum: { $sum: [ "$a", "$b", "$c", "$d", "$e" ] } } } ] )
Hasil:
{ "_id" :1, "sum" :10 }{ "_id" :2, "sum" :6 }{ "_id" :3, "sum" :6 }{ "_id" :4, " jumlah" :0 }Dalam hal ini saya memberikan bidang tambahan (
$e
) yang tidak ada dalam dokumen.$sum
menghitung jumlah berdasarkan sisa bidang yang lakukan ada.Namun, inilah yang terjadi ketika tidak ada bidang yang ada:
db.data.aggregate( [ { $project: { result: { $sum: [ "$x", "$y", "$z" ] } } } ] )
Hasil:
{ "_id" :1, "result" :0 }{ "_id" :2, "result" :0 }{ "_id" :3, "result" :0 }{ "_id" :4, " hasil" :0 }Hasilnya adalah
0
untuk semua dokumen.Seperti yang kita lihat sebelumnya, saat menggunakan sintaks argumen tunggal, bidang yang hilang menghasilkan
0
.Contoh:
db.pets.aggregate( [ { $group: { _id: "$type", sum: { $sum: "$oops!" } } } ] )
Hasil:
{ "_id" :"Kucing", "jumlah" :0 }{ "_id" :"Anjing", "jumlah" :0 }{ "_id" :"Kanguru", "jumlah" :0 }Tahap yang Tersedia
$sum
tersedia dalam tahapan berikut:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
tahap yang menyertakan$expr
ekspresi