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
kescores
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 menyediakannull
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-rataa
,b
,c
, dand
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
, dan4
.Namun, dua dokumen berikutnya hanya mengembalikan rata-rata nilai input
1
,2
, dan3
.$avg
operator mengabaikand
. 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
mengembalikannull
. 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 mengembalikannull
.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