Di MongoDB, $stdDevSamp
operator pipa agregasi menghitung standar deviasi sampel dari nilai input.
Nilai input dapat berasal dari sekelompok dokumen (yaitu dokumen yang dikelompokkan dengan kunci yang sama), atau dapat berupa beberapa bidang dalam satu dokumen.
$stdDevSamp
mirip dengan $stdDevPop
. Perbedaannya adalah $stdDevSamp
menghitung sampel simpangan baku, sedangkan $stdDevPop
menghitung populasi simpangan baku.
Oleh karena itu, gunakan $stdDevSamp
jika nilai Anda mencakup sampel dari suatu populasi data yang dapat digunakan untuk menggeneralisasi tentang populasi tersebut. Jika nilai mewakili seluruh populasi data atau Anda tidak ingin menggeneralisasi tentang populasi yang lebih besar, gunakan $stdDevPop
sebagai gantinya.
Sintaks
$stdDevSamp
operator mendukung dua sintaks.
Sintaks 1
{ $stdDevSamp: <expression> }
Sintaks 2:
{ $stdDevSamp: [ <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, $stdDevSamp
mengembalikan sampel standar deviasi 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 $stdDevSamp
dalam hubungannya dengan $group
untuk mengembalikan sampel standar deviasi di 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 $stdDevSamp
untuk mengembalikan sampel standar deviasi price
kolom untuk setiap grup:
db.stonks.aggregate(
[
{
$group:
{
_id: "$ticker",
result: { $stdDevSamp: "$price" }
}
}
]
)
Hasil:
{ "_id" : "gme", "result" : 131.24404748406687 } { "_id" : "jnj", "result" : 10.344080432788612 }
Kita dapat melihat bahwa gme
memiliki simpangan baku sampel yang jauh lebih tinggi daripada jnj
.
Array
Contoh ini berlaku $stdDevSamp
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 }
Kita dapat menerapkan $stdDevSamp
ke scores
kolom di setiap dokumen:
db.players.aggregate(
[
{
$project:
{
result: { $stdDevSamp: "$scores" }
}
}
]
)
Hasil:
{ "_id" : 1, "result" : 3.0783421635988546 } { "_id" : 2, "result" : 7.633260552782583 } { "_id" : 3, "result" : 5.988878581726855 } { "_id" : 4, "result" : null } { "_id" : 5, "result" : null } { "_id" : 6, "result" : null }
Dalam hal ini, tiga dokumen pertama mengembalikan deviasi standar sampel untuk berbagai angka yang ada di lariknya masing-masing.
Dokumen 4 menghasilkan standar deviasi null
. Ini karena kami hanya menyediakan satu nomor dalam array. Jika kita menggunakan $stdDevPop
, ini akan mengembalikan 0
.
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 $stdDevSamp
dengan lebih dari satu argumen. $stdDevSamp
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 $stdDevSamp
untuk mengembalikan contoh simpangan baku a
, b
, c
, dan d
bidang setiap dokumen:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevSamp: [ "$a", "$b", "$c", "$d" ] }
}
}
]
)
Hasil:
{ "_id" : 1, "result" : 1.2909944487358056 } { "_id" : 2, "result" : 1 } { "_id" : 3, "result" : 1 }
Hasil dokumen pertama didasarkan pada nilai input 1
, 2
, 3
, dan 4
.
Namun, dua dokumen terakhir hanya menghasilkan 1
, 2
, dan 3
sedang dievaluasi. $stdDevSamp
operator mengabaikan d
. mereka bidang.
$stdDevSamp
mengabaikan nilai non-numerik. Jadi dalam hal ini mengabaikan "Hey"
dalam dokumen 3 dan menghitung deviasi standar sampel dari bidang (numerik) yang tersisa.
Sedangkan untuk dokumen 2, d
bidang berisi array. Seperti disebutkan, $stdDevSamp
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, $stdDevSamp
mengabaikan nilai non-numerik.
Jika semua nilai non-numerik, maka $stdDevSamp
mengembalikan null
.
Bidang Tidak Ada
Saat menggunakan sintaks multi-argumen, $stdDevSamp
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: { $stdDevSamp: [ "$a", "$b", "$c", "$d", "$e" ] }
}
}
]
)
Hasil:
{ "_id" : 1, "result" : 1.2909944487358056 } { "_id" : 2, "result" : 1 } { "_id" : 3, "result" : 1 }
Dalam hal ini saya memberikan bidang tambahan ($e
) yang tidak ada dalam dokumen. $stdDevSamp
menghitung deviasi standar sampel berdasarkan bidang yang tersisa yang lakukan ada.
Namun, inilah yang terjadi ketika tidak ada bidang yang ada:
db.data.aggregate(
[
{
$project:
{
result: { $stdDevSamp: [ "$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",
result: { $stdDevSamp: "$oops!" }
}
}
]
)
Hasil:
{ "_id" : "gme", "result" : null } { "_id" : "jnj", "result" : null }
Tahap yang Tersedia
$stdDevSamp
tersedia dalam tahapan berikut:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
tahap yang menyertakan$expr
ekspresi