Di MongoDB, $stdDevPop
operator pipa agregasi menghitung deviasi standar populasi dari nilai inputnya.
Nilai input dapat berasal dari sekelompok dokumen (yaitu dokumen yang dikelompokkan dengan kunci yang sama), atau dapat berupa beberapa bidang dalam satu dokumen.
Sintaks
$stdDevPop
operator mendukung dua sintaks.
Sintaks 1
{ $stdDevPop: <expression> }
Sintaks 2:
{ $stdDevPop: [ <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, $stdDevPop
mengembalikan deviasi standar populasi dari ekspresi yang ditentukan untuk sekelompok dokumen yang berbagi kelompok yang sama dengan kunci.
Contoh Sintaks 1 (Argumen Tunggal)
Berikut adalah beberapa contoh yang menggunakan sintaks 1.
Dokumen yang Dikelompokkan
Contoh ini menggunakan $stdDevPop
dalam hubungannya dengan $group
untuk mengembalikan simpangan baku pada sekelompok dokumen yang dikelompokkan berdasarkan kunci.
Misalkan kita memiliki koleksi yang disebut stonks
dengan dokumen sebagai berikut:
{ "_id" : 1, "ticker" : "gme", "price" : 10 } { "_id" : 2, "ticker" : "gme", "price" : 40 } { "_id" : 3, "ticker" : "gme", "price" : 90 } { "_id" : 4, "ticker" : "gme", "price" : 180 } { "_id" : 5, "ticker" : "gme", "price" : 290 } { "_id" : 6, "ticker" : "gme", "price" : 390 } { "_id" : 7, "ticker" : "gme", "price" : 190 } { "_id" : 8, "ticker" : "gme", "price" : 90 } { "_id" : 9, "ticker" : "gme", "price" : 10 } { "_id" : 10, "ticker" : "jnj", "price" : 131 } { "_id" : 11, "ticker" : "jnj", "price" : 133 } { "_id" : 12, "ticker" : "jnj", "price" : 138 } { "_id" : 13, "ticker" : "jnj", "price" : 141 } { "_id" : 14, "ticker" : "jnj", "price" : 145 } { "_id" : 15, "ticker" : "jnj", "price" : 150 } { "_id" : 16, "ticker" : "jnj", "price" : 154 } { "_id" : 17, "ticker" : "jnj", "price" : 156 } { "_id" : 18, "ticker" : "jnj", "price" : 160 }
Kami dapat mengelompokkan dokumen-dokumen ini berdasarkan ticker
mereka bidang, lalu gunakan $stdDevPop
untuk mengembalikan simpangan baku populasi dari price
kolom untuk setiap grup:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
standardDeviation: { $stdDevPop: "$price" }
}
}
]
)
Hasil:
{ "_id" : "gme", "standardDeviation" : 123.7380746218039 } { "_id" : "jnj", "standardDeviation" : 9.752492558885207 }
Kita dapat melihat bahwa gme
memiliki standar deviasi yang jauh lebih tinggi daripada jnj
.
Array
Contoh ini berlaku $stdDevPop
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", "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 }
Kami dapat menerapkan $stdDevPop
ke scores
kolom di setiap dokumen:
db.players.aggregate(
[
{
$project:
{
standardDeviation: { $stdDevPop: "$scores" }
}
}
]
)
Hasil:
{ "_id" : 1, "standardDeviation" : 2.849991049037143 } { "_id" : 2, "standardDeviation" : 6.968181653455625 } { "_id" : 3, "standardDeviation" : 5.467073155618908 } { "_id" : 4, "standardDeviation" : 0 } { "_id" : 5, "standardDeviation" : null } { "_id" : 6, "standardDeviation" : null }
Dalam hal ini, tiga dokumen pertama mengembalikan standar deviasi untuk berbagai angka yang ada di array masing-masing.
Dokumen 4 menghasilkan standar deviasi 0
. Ini karena kami hanya menyediakan satu nomor dalam array.
Dokumen 5 mengembalikan null
karena kami menyediakan array kosong.
Dokumen 6 mengembalikan null
karena kami menyediakan null
sebagai argumen.
Contoh Sintaks 2 (Beberapa Argumen)
Sintaks kedua melibatkan penyediaan $stdDevPop
dengan lebih dari satu argumen. $stdDevPop
kemudian menghitung simpangan baku 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" : "Hey" }
Kita bisa menggunakan $stdDevPop
untuk mengembalikan simpangan baku populasi a
, b
, c
, dan d
bidang setiap dokumen:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevPop: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
Hasil:
{ "_id" : 1, "result" : 1.118033988749895 } { "_id" : 2, "result" : 0.816496580927726 } { "_id" : 3, "result" : 0.816496580927726 }
Dokumen 1 mengembalikan standar deviasi berdasarkan nilai input 1
, 2
, 3
, dan 4
.
Namun, dua dokumen terakhir hanya mengembalikan standar deviasi untuk nilai input 1
, 2
, dan 3
. $stdDevPop
operator mengabaikan d
. mereka bidang.
Mengapa ini?
Cara kerjanya adalah $stdDevPop
mengabaikan nilai non-numerik. Jadi dalam hal ini mengabaikan "Hey"
dalam dokumen 3 dan menghitung deviasi standar populasi dari bidang (numerik) yang tersisa.
Sedangkan untuk dokumen 2, d
bidang berisi array. Seperti disebutkan, $stdDevPop
operator mengabaikan array saat menggunakan sintaks multi-argumen. Lebih tepatnya, ini memperlakukan array sebagai nilai non-numerik saat digunakan dalam konteks ini. Dan seperti yang disebutkan, $stdDevPop
mengabaikan nilai non-numerik.
Jika semua nilai non-numerik, maka $stdDevPop
mengembalikan null
.
Bidang Tidak Ada
Saat menggunakan sintaks multi-argumen, $stdDevPop
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:
{
result: { $stdDevPop: [ "$a", "$b", "$c", "$d", "$e" ] }
}
}
]
)
Hasil:
{ "_id" : 1, "result" : 1.118033988749895 } { "_id" : 2, "result" : 0.816496580927726 } { "_id" : 3, "result" : 0.816496580927726 }
Dalam hal ini saya memberikan bidang tambahan ($e
) yang tidak ada dalam dokumen. $stdDevPop
menghitung simpangan baku berdasarkan bidang yang tersisa yang lakukan ada.
Namun, inilah yang terjadi ketika tidak ada bidang yang ada:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevPop: [ "$x", "$y", "$z" ] }
}
}
]
)
Hasil:
{ "_id" : 1, "result" : null } { "_id" : 2, "result" : null } { "_id" : 3, "result" : null }
Hasilnya adalah null
untuk semua dokumen.
Saat menggunakan sintaks argumen tunggal, bidang yang hilang menghasilkan null
.
Contoh:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
standardDeviation: { $stdDevPop: "$oops!" }
}
}
]
)
Hasil:
{ "_id" : "gme", "standardDeviation" : null } { "_id" : "jnj", "standardDeviation" : null }
Tahap yang Tersedia
$stdDevPop
tersedia dalam tahapan berikut:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
tahap yang menyertakan$expr
ekspresi
Hitung Standar Deviasi Sampel
Lihat MongoDB $stdDevSamp
jika Anda perlu mendapatkan sampel simpangan baku, berlawanan dengan populasi standar deviasi. Operator ini berguna jika nilai Anda mencakup sampel populasi data yang akan digunakan untuk menggeneralisasi populasi.