MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB $sum Agregasi Pipeline Operator

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
  • $match tahap yang menyertakan $expr ekspresi

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB - Buat Hubungan

  2. Grup MongoDB berdasarkan jam

  3. Cegah login duplikat dengan FOSUserBundle

  4. Cara Menyebarkan Database Open edX MongoDB untuk Ketersediaan Tinggi

  5. bagaimana cara mongoimport data ke aplikasi meteor yang digunakan?