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 ke scores 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 menyediakan null 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 jumlah a , b , c , dan d 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 , dan 4 .
Namun, dua dokumen berikutnya hanya mengembalikan jumlah nilai input 1 , 2 , dan 3 . $sum operator mengabaikan d . 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 mengembalikan 0 . 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 mengembalikan 0 .
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$matchtahap yang menyertakan$exprekspresi