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

MongoDB $avg Aggregation Pipeline Operator

Di MongoDB, $avg operator pipeline agregasi menghitung dan mengembalikan nilai rata-rata dari nilai numerik yang ditentukan.

Sintaks

$avg operator mendukung dua sintaks.

Sintaks 1

{ $avg: <expression> } 

Sintaks 2:

{ $avg: [ <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, $avg mengembalikan rata-rata kolektif dari semua nilai numerik yang dihasilkan dari penerapan ekspresi tertentu 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 $avg dalam hubungannya dengan $group untuk mengembalikan rata-rata 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 $avg untuk mengembalikan bobot rata-rata setiap grup:

db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            average_weight: { $avg: "$weight" }
          }
     }
   ]
) 

Hasil:

{ "_id" :"Anjing", "berat_rata" :20 }{ "_id" :"Kucing", "berat_rata" :9 }{ "_id" :"Kanguru", "berat_rata" :143.3333333333334 } 

Array

Contoh ini berlaku $avg 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 $avg ke scores kolom di setiap dokumen:

db.players.aggregate(
   [
     {
       $project:
          {
            player: 1,
            averageScore: { $avg: "$scores" }
          }
     }
   ]
) 

Hasil:

{ "_id" :1, "player" :"Homer", "averageScore" :4.142857142857143 }{ "_id" :2, "player" :"Marge", "averageScore" :8.666666666666666 }{ "_id" :3, "player" :"Bart", "averageScore" :6.333333333333333 }{ "_id" :4, "player" :"Brian", "averageScore" :7 }{ "_id" :5, "player" :"Farnsworth ", "averageScore" :null }{ "_id" :6, "player" :"Meg", "averageScore" :null }{ "_id" :7, "player" :"Ron", "averageScore" :null } 

Dalam hal ini, empat dokumen pertama mengembalikan rata-rata dari berbagai angka yang ada dalam susunannya masing-masing.

Dalam kasus dokumen 4, ini sama dengan angka, karena hanya ada satu angka dalam larik.

Dokumen 5 mengembalikan null karena kami menyediakan array kosong.

Dokumen 6 mengembalikan null karena kami menyediakan null sebagai argumen.

Dokumen 7 mengembalikan null karena bidangnya bahkan tidak ada.

Contoh Sintaks 2 (Beberapa Argumen)

Sintaks kedua melibatkan penyediaan $avg dengan lebih dari satu argumen. $avg kemudian menghitung rata-rata 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 dapat menggunakan $avg untuk mengembalikan rata-rata a , b , c , dan d bidang setiap dokumen:

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

Hasil:

{ "_id" :1, "avg" :2.5 }{ "_id" :2, "avg" :2 }{ "_id" :3, "avg" :2 }{ "_id" :4, " rata" :null }

Dokumen 1 mengembalikan rata-rata nilai input 1 , 2 , 3 , dan 4 .

Namun, dua dokumen berikutnya hanya mengembalikan rata-rata nilai input 1 , 2 , dan 3 . $avg operator mengabaikan d . mereka bidang.

Ini karena $avg mengabaikan nilai non-numerik. Jadi dalam hal ini mengabaikan "Hey" dalam dokumen 3 dan menghitung rata-rata dari bidang (numerik) yang tersisa.

Sedangkan untuk dokumen 2, d bidang berisi array. Seperti disebutkan, $avg operator mengabaikan array saat menggunakan sintaks multi-argumen. Lebih tepatnya, ini memperlakukan array sebagai nilai non-numerik saat digunakan dalam konteks ini, dan $avg mengabaikan nilai non-numerik.

Jika semua nilai non-numerik, maka $avg mengembalikan null . Kita dapat melihat ini dengan dokumen 4.

Bidang Tidak Ada

Saat menggunakan sintaks multi-argumen, $avg mengabaikan bidang yang hilang. Artinya, jika Anda menyediakan bidang yang tidak ada, itu akan mengabaikannya. Jika tidak ada bidang yang ada, maka akan mengembalikan null .

Contoh:

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

Hasil:

{ "_id" :1, "avg" :2.5 }{ "_id" :2, "avg" :2 }{ "_id" :3, "avg" :2 }{ "_id" :4, " rata" :null }

Dalam hal ini saya memberikan bidang tambahan ($e ) yang tidak ada dalam dokumen. $avg menghitung rata-rata berdasarkan bidang yang tersisa yang lakukan ada.

Namun, inilah yang terjadi ketika tidak ada bidang yang ada:

db.data.aggregate(
   [
     {
       $project:
          {
            result: { $avg: [ "$x", "$y", "$z" ] }
          }
     }
   ]
) 

Hasil:

{ "_id" :1, "result" :null }{ "_id" :2, "result" :null }{ "_id" :3, "result" :null }{ "_id" :4, " hasil" :null }

Hasilnya adalah null untuk semua dokumen.

Seperti yang kita lihat sebelumnya, saat menggunakan sintaks argumen tunggal, bidang yang hilang menghasilkan null .

Contoh:

db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            avg: { $avg: "$oops!" }
          }
     }
   ]
) 

Hasil:

{ "_id" :"Kangaroo", "avg" :null }{ "_id" :"Kucing", "avg" :null }{ "_id" :"Anjing", "avg" :null } 

Tahap yang Tersedia

$avg 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. Seberapa cepat Redis daripada mongoDB?

  2. MongoDB:mongoimport kehilangan koneksi saat mengimpor file besar

  3. Kata sandi MongoDB dengan @ di dalamnya

  4. jelaskan() di Mongodb:perbedaan antara nscanned dan nscannedObjects

  5. Cara Mengonversi Tampilan MongoDB menjadi Koleksi