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

MongoDB $stdDevPop

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.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana saya bisa menunggu wadah buruh pelabuhan aktif dan berjalan?

  2. Manajemen AWS:Cara Menghemat 30% Biaya Hosting MongoDB Anda

  3. mongoDB:format $dateToString untuk menunjukkan waktu dengan interval 15 menit

  4. 5 Manfaat Teratas dari Hosting Bersama MongoDB

  5. Bagaimana cara melanjutkan penyisipan setelah kesalahan kunci duplikat menggunakan PyMongo