Saya baru mengenal mongodb dan mungkin saya melewatkan sesuatu. Namun memiliki sampel yang banyak di internet, masih mengalami kendala untuk mendapatkan total pada satu field yang merupakan bagian dari array objek. Inilah yang saya lakukan
db.collection.insertMany([ { "id" : "6002010011500", "balance" : [ { "type" : "PR", "amount" : "1000" }, { "type" : "IN", "amount" : "300" } ] }, {"id" : "5001010001005", "balance": [ { "type" : "PR", "amount" : "-3000" }, { "type" : "IN", "amount" : "-600" } ] } ])mencoba untuk mendapatkan jumlah total dengan cara yang berbeda
db.collection.aggregate([ {$group:{_id:null, TotalBalance:{$sum:"$balance.amount"}}} ])_mendapatkan saldo 0 bukannya -2300
{ "_id" : null, "TotalBalance" : 0 }hal yang sama dengan $unwind
db.collection.aggregate([ {$unwind:"$balance"}, {$group:{_id:null, TotalBalance:{$sum:"$balance.amount"}}} ])apa yang saya lakukan salah?
terima kasih
Di MongoDB, operator pipa agregasi { $sum: [ <expression1>, <expression2> .. ] }_7 menghitung dan mengembalikan jumlah nilai numerik
Sintaksis
Operator { $sum: [ <expression1>, <expression2> .. ] }7 mendukung dua sintaks
Sintaks 1
{ $sum: <expression> }_Sintaks 2
Sintaks pertama menerima satu argumen dan sintaks kedua menerima banyak argumen
Saat digunakan dalam tahap { $sum: [ <expression1>, <expression2> .. ] }_9, Anda hanya dapat menggunakan sintaks pertama. Dalam hal ini, { $sum: [ <expression1>, <expression2> .. ] }_7 mengembalikan jumlah kolektif 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: [ <expression1>, <expression2> .. ] }7 bersamaan dengan { $sum: [ <expression1>, <expression2> .. ] }9 untuk mengembalikan jumlah pada sekelompok dokumen yang dikelompokkan berdasarkan kunci
Misalkan kita memiliki koleksi bernama { "_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 }_3 dengan dokumen-dokumen berikut
{ "_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 }Kita dapat mengelompokkan dokumen ini berdasarkan bidang { "_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 }_4, lalu menggunakan { $sum: [ <expression1>, <expression2> .. ] }7 untuk mengembalikan jumlah bidang { "_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 }6 untuk setiap grup
db.pets.aggregate( [ { $group: { _id: "$type", sum: { $sum: "$weight" } } } ] )Hasil
{ "_id" : "Kangaroo", "sum" : 430 } { "_id" : "Cat", "sum" : 27 } { "_id" : "Dog", "sum" : 60 }Array
Contoh ini berlaku { $sum: [ <expression1>, <expression2> .. ] }_7 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 bernama { "_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 }_8 dengan dokumen-dokumen berikut
Kami dapat menerapkan { $sum: [ <expression1>, <expression2> .. ] }7 ke bidang db.pets.aggregate( [ { $group: { _id: "$type", sum: { $sum: "$weight" } } } ] )0 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 di lariknya masing-masing
Dalam kasus dokumen 4, ini sama dengan angka, karena hanya ada satu angka dalam larik
Dokumen 5 mengembalikan db.pets.aggregate( [ { $group: { _id: "$type", sum: { $sum: "$weight" } } } ] )1 karena kami menyediakan larik kosong
Dokumen 6 dikembalikan db.pets.aggregate( [ { $group: { _id: "$type", sum: { $sum: "$weight" } } } ] )1 karena kami memberikan db.pets.aggregate( [ { $group: { _id: "$type", sum: { $sum: "$weight" } } } ] )3 sebagai argumen
Dokumen 7 mengembalikan db.pets.aggregate( [ { $group: { _id: "$type", sum: { $sum: "$weight" } } } ] )1 karena bidangnya bahkan tidak ada
Contoh Sintaks 2 (Beberapa Argumen)
Sintaks kedua melibatkan penyediaan { $sum: [ <expression1>, <expression2> .. ] }7 dengan lebih dari satu argumen. { $sum: [ <expression1>, <expression2> .. ] }_7 kemudian menghitung jumlah berdasarkan semua argumen yang disediakan
Misalkan kita memiliki koleksi bernama db.pets.aggregate( [ { $group: { _id: "$type", sum: { $sum: "$weight" } } } ] )_7 dengan dokumen-dokumen 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" : "Hey" } { "_id" : 4, "a" : "One", "b" : "Two", "c" : "Three", "d" : "Four" }Kita dapat menggunakan { $sum: [ <expression1>, <expression2> .. ] }7 untuk mengembalikan jumlah bidang db.pets.aggregate( [ { $group: { _id: "$type", sum: { $sum: "$weight" } } } ] )9, { "_id" : "Kangaroo", "sum" : 430 } { "_id" : "Cat", "sum" : 27 } { "_id" : "Dog", "sum" : 60 }0, { "_id" : "Kangaroo", "sum" : 430 } { "_id" : "Cat", "sum" : 27 } { "_id" : "Dog", "sum" : 60 }1, dan { "_id" : "Kangaroo", "sum" : 430 } { "_id" : "Cat", "sum" : 27 } { "_id" : "Dog", "sum" : 60 }2 dari setiap dokumen
Hasil
{ $sum: [ <expression1>, <expression2> .. ] }_0Dokumen 1 mengembalikan jumlah nilai input { "_id" : "Kangaroo", "sum" : 430 } { "_id" : "Cat", "sum" : 27 } { "_id" : "Dog", "sum" : 60 }3, { "_id" : "Kangaroo", "sum" : 430 } { "_id" : "Cat", "sum" : 27 } { "_id" : "Dog", "sum" : 60 }4, { "_id" : "Kangaroo", "sum" : 430 } { "_id" : "Cat", "sum" : 27 } { "_id" : "Dog", "sum" : 60 }5, dan { "_id" : "Kangaroo", "sum" : 430 } { "_id" : "Cat", "sum" : 27 } { "_id" : "Dog", "sum" : 60 }6
Namun, dua dokumen berikutnya hanya mengembalikan jumlah dari nilai input { "_id" : "Kangaroo", "sum" : 430 } { "_id" : "Cat", "sum" : 27 } { "_id" : "Dog", "sum" : 60 }3, { "_id" : "Kangaroo", "sum" : 430 } { "_id" : "Cat", "sum" : 27 } { "_id" : "Dog", "sum" : 60 }4, dan { "_id" : "Kangaroo", "sum" : 430 } { "_id" : "Cat", "sum" : 27 } { "_id" : "Dog", "sum" : 60 }5. Operator { $sum: [ <expression1>, <expression2> .. ] }7 mengabaikan bidang { "_id" : "Kangaroo", "sum" : 430 } { "_id" : "Cat", "sum" : 27 } { "_id" : "Dog", "sum" : 60 }2 mereka
Ini karena { $sum: [ <expression1>, <expression2> .. ] }7 mengabaikan nilai non-numerik. Jadi dalam hal ini diabaikan { "_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" }_3 dalam dokumen 3 dan menghitung jumlah dari bidang (numerik) yang tersisa
Untuk dokumen 2, field { "_id" : "Kangaroo", "sum" : 430 } { "_id" : "Cat", "sum" : 27 } { "_id" : "Dog", "sum" : 60 }2 berisi array. Seperti disebutkan, operator { $sum: [ <expression1>, <expression2> .. ] }_7 mengabaikan array saat menggunakan sintaks multi-argumen. Lebih tepatnya, ini memperlakukan array sebagai nilai non-numerik saat digunakan dalam konteks ini, dan { $sum: [ <expression1>, <expression2> .. ] }7 mengabaikan nilai non-numerik
Jika semua nilai non-numerik, maka { $sum: [ <expression1>, <expression2> .. ] }7 mengembalikan db.pets.aggregate( [ { $group: { _id: "$type", sum: { $sum: "$weight" } } } ] )1. Kita bisa melihat ini dengan dokumen 4
Bidang yang Hilang
Saat menggunakan sintaks multi-argumen, { $sum: [ <expression1>, <expression2> .. ] }7 mengabaikan bidang yang hilang. Artinya, jika Anda menyediakan bidang yang tidak ada, bidang tersebut akan diabaikan. Jika tidak ada bidang yang ada, maka ia mengembalikan db.pets.aggregate( [ { $group: { _id: "$type", sum: { $sum: "$weight" } } } ] )1
Contoh
{ $sum: [ <expression1>, <expression2> .. ] }_1Hasil
{ $sum: [ <expression1>, <expression2> .. ] }_0Dalam hal ini saya memberikan bidang tambahan (db.players.aggregate( [ { $project: { player: 1, sum: { $sum: "$scores" } } } ] )1) yang tidak ada dalam dokumen. { $sum: [ <expression1>, <expression2> .. ] }_7 menghitung jumlah berdasarkan sisa kolom yang ada