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

Rata-rata Bidang Sub Dokumen Di Seluruh Dokumen di Mongo

Anda harus menggunakan kerangka kerja agregasi. Agregasi akan berakhir seperti ini:

db.stack.aggregate([
  { $match: { "samples.key" : "test-key" } },
  { $unwind : "$samples" },
  { $match : { "samples.key" : "test-key" } },
  { $project : { "new_key" : "$samples.key", "new_value" : "$samples.value" } },
  { $group : { `_id` : "$new_key", answer : { $avg : "$new_value" } } }
])

Cara terbaik untuk memikirkan kerangka kerja agregasi adalah seperti jalur perakitan. Kueri itu sendiri adalah larik dokumen JSON, di mana setiap sub-dokumen mewakili langkah yang berbeda dalam perakitan.

Langkah 1:$match

Langkah pertama adalah filter dasar, seperti klausa WHERE dalam SQL. Kami menempatkan langkah ini terlebih dahulu untuk menyaring semua dokumen yang tidak mengandung elemen array yang mengandung test-key . Menempatkan ini di awal pipa memungkinkan agregasi untuk menggunakan indeks.

Langkah 2:$bersantai

Langkah kedua, $unwind , digunakan untuk memisahkan setiap elemen dalam larik "sampel" sehingga kami dapat melakukan operasi di semua elemen tersebut. Jika Anda menjalankan kueri hanya dengan langkah itu, Anda akan mengerti maksud saya. Singkat cerita :

{ name : "bob", 
  children : [ {"name" : mary}, { "name" : "sue" } ] 
} 

menjadi dua dokumen :

{ name : "bob", children : [ { "name" : mary } ] }
{ name : "bob", children : [ { "name" : sue } ] }

Langkah 3:$match

Langkah ketiga, $match , adalah duplikat yang tepat dari $match first pertama panggung, tetapi memiliki tujuan yang berbeda. Karena mengikuti $unwind , tahap ini menyaring elemen larik sebelumnya, sekarang mendokumentasikan, yang tidak cocok dengan kriteria filter. Dalam hal ini, kami hanya menyimpan dokumen di mana samples.key = "test-key"

Langkah 4:$project (Opsional)

Langkah keempat, $project , merestrukturisasi dokumen. Dalam hal ini, saya menarik item keluar dari array sehingga saya dapat merujuknya secara langsung. Menggunakan contoh di atas..

{ name : "bob", children : [ { "name" : mary } ] }

menjadi

{ new_name : "bob", new_child_name : mary }

Perhatikan bahwa langkah ini sepenuhnya opsional; tahap selanjutnya dapat diselesaikan bahkan tanpa $project setelah beberapa perubahan kecil. Dalam kebanyakan kasus $project sepenuhnya kosmetik; agregasi memiliki banyak pengoptimalan di bawah tenda sehingga secara manual memasukkan atau mengecualikan bidang dalam $project seharusnya tidak diperlukan.

Langkah 5:$group

Terakhir, $group adalah di mana keajaiban terjadi. _id nilai apa yang akan Anda "kelompokkan" di dunia SQL. Bidang kedua mengatakan rata-rata di atas nilai yang saya tetapkan di $project melangkah. Anda dapat dengan mudah mengganti $sum untuk melakukan penjumlahan, tetapi operasi penghitungan biasanya dilakukan dengan cara berikut:my_count : { $sum : 1 } .

Hal terpenting yang perlu diperhatikan di sini adalah bahwa sebagian besar pekerjaan yang dilakukan adalah memformat data ke titik di mana melakukan operasi itu sederhana.

Catatan Akhir

Terakhir, saya ingin mencatat bahwa ini tidak kerjakan contoh data yang diberikan sejak samples.value didefinisikan sebagai teks, yang tidak dapat digunakan dalam operasi aritmatika. Jika Anda tertarik, mengubah jenis bidang dijelaskan di sini:MongoDB Cara mengubah jenis bidang




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tidak dapat terhubung ke mongoDB yang berjalan di wadah buruh pelabuhan

  2. Agregasi Mongo Cocokkan beberapa nilai

  3. Redis vs MongoDB

  4. Kueri agregasi rata-rata Mongo tanpa grup

  5. Mengotomatiskan dan Mengelola MongoDB di Cloud