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

MongoDB $stdDevSamp

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

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mengumumkan ClusterControl 1.4.2 - Edisi DevOps

  2. MongoDB - pengguna admin tidak diotorisasi

  3. MongoDB - ukuran file sangat besar dan terus bertambah

  4. Bisakah saya mengubah indeks yang ada di MongoDB tanpa menghapusnya?

  5. C# kueri mongo dengan string json