Bagaimana Anda menjumlahkan bidang di mongodb?

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

{ $sum: [ <expression1>, <expression2> .. ]  }
_

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

{ "_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" }

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

db.data.aggregate(
   [
     {
       $project:
          {
            sum: { $sum: [ "$a", "$b", "$c", "$d" ] }
          }
     }
   ]
)

Hasil

{ $sum: [ <expression1>, <expression2> .. ]  }
_0

Dokumen 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> .. ]  }
_1

Hasil

{ $sum: [ <expression1>, <expression2> .. ]  }
_0

Dalam 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

Bagaimana Anda menjumlahkan nilai dalam MongoDB?

Untuk mendapatkan jumlah nilai kunci di semua dokumen dalam koleksi MongoDB, Anda dapat menggunakan agregat() .

Bagaimana cara menemukan jumlah kolom di MongoDB?

Jika digunakan pada bidang yang berisi nilai numerik dan non-numerik, $sum mengabaikan nilai non-numerik dan mengembalikan jumlah nilai numerik. If used on a field that does not exist in any document in the collection, $sum returns 0 for that field. If all operands are non-numeric, $sum returns 0 .

Bagaimana cara melakukan perhitungan di MongoDB?

Untuk membuat kolom kalkulasi. .
Di pojok panel Bidang, klik Tambahkan Bidang
Pilih Terhitung
Masukkan Nama Bidang dari bidang terhitung yang ingin Anda tentukan. Anda dapat menentukan bidang bersarang dengan menggunakan notasi titik. .
Masukkan Ekspresi Nilai menggunakan bahasa ekspresi sederhana atau Ekspresi Operator
Klik Simpan Bidang

Apa itu $sum 1 di MongoDB?

1 Jawaban. Di MongoDB, $sum akan menjumlahkan nilai ekspresi untuk setiap baris dan dalam kasus Anda, Anda memiliki 3 baris sehingga akan menjadi 1 .