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$matchtahap yang menyertakan$exprekspresi