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

Kursor &penghitungan agregasi Mongo

Ini mungkin memerlukan penjelasan lengkap bagi mereka yang mungkin mencari ini, jadi tambahkan satu untuk anak cucu.

Secara khusus apa yang dikembalikan adalah Aliran Peristiwa untuk node.js yang secara efektif menggabungkan aliran dapat dibaca antarmuka dengan beberapa metode kenyamanan. Sebuah .count() bukan salah satu dari mereka saat ini dan mengingat antarmuka yang digunakan saat ini tidak masuk akal.

Mirip dengan hasil yang dikembalikan dari .stream() metode yang tersedia untuk objek kursor, "hitungan" tidak akan masuk akal di sini ketika Anda mempertimbangkan implementasinya, karena ini dimaksudkan untuk diproses sebagai "aliran" di mana pada akhirnya Anda akan mencapai "akhir" tetapi sebaliknya hanya ingin memproses sampai di sana.

Jika Anda mempertimbangkan antarmuka "Cursor" standar dari driver, ada beberapa alasan kuat mengapa kursor agregasi tidak sama:

  1. Kursor memungkinkan tindakan "pengubah" diproses sebelum dieksekusi. Ini termasuk dalam kategori .sort() , .limit() dan .skip() . Semua ini sebenarnya memiliki arahan mitra dalam kerangka agregasi yang ditentukan dalam pipa. Sebagai tahapan saluran yang dapat muncul "di mana saja" dan bukan hanya sebagai opsi pasca-pemrosesan untuk kueri sederhana, ini tidak masuk akal untuk menawarkan pemrosesan "kursor" yang sama.

  2. Pengubah kursor lainnya termasuk spesial seperti .hint() , .min() dan .max() yang merupakan perubahan pada "pemilihan indeks" dan pemrosesan. Meskipun ini dapat berguna untuk saluran agregasi, saat ini tidak ada cara sederhana untuk memasukkan ini dalam pemilihan kueri. Sebagian besar logika dari poin sebelumnya mengesampingkan setiap poin menggunakan jenis antarmuka yang sama untuk "Cursor".

Pertimbangan lainnya adalah apa yang sebenarnya ingin Anda lakukan dengan kursor dan mengapa Anda "ingin" mengembalikannya. Karena kursor biasanya merupakan "perjalanan satu arah" dalam arti bahwa mereka biasanya hanya diproses sampai akhir tercapai dan dalam "batch" yang dapat digunakan, maka itu membuat kesimpulan yang masuk akal bahwa "hitungan" sebenarnya datang di akhir, padahal sebenarnya "antrian" itu akhirnya habis.

Meskipun benar bahwa implementasi "kursor" standar memiliki beberapa trik, alasan utamanya adalah bahwa ini hanya memperluas konsep data "meta" karena mesin pembuatan profil kueri harus "memindai" sejumlah dokumen untuk menentukan mana item untuk dikembalikan dalam hasil.

Kerangka kerja agregasi sedikit bermain dengan konsep ini. Karena tidak hanya ada hasil yang sama seperti yang akan diproses melalui profiler kueri standar, tetapi juga ada tahapan tambahan. Setiap tahapan ini berpotensi untuk "memodifikasi" hasil "hitungan" yang sebenarnya akan dikembalikan dalam "aliran" untuk diproses.

Sekali lagi, jika Anda ingin melihat ini dari sudut pandang akademis dan mengatakan bahwa "Tentu, mesin kueri harus menyimpan 'meta data' untuk penghitungan, tetapi bisakah kita tidak melacak apa yang diubah setelahnya?". Ini akan menjadi argumen yang adil, dan operator saluran seperti $match dan $group atau $unwind dan bahkan mungkin menyertakan $project dan $redact yang baru , semua dapat dianggap sebagai kasus yang masuk akal untuk melacak "dokumen yang diproses" di setiap tahap pipeline dan memperbaruinya dalam "meta data" yang mungkin dapat dikembalikan untuk menjelaskan jumlah hasil pipeline lengkap.

Argumen terakhir masuk akal, tetapi pertimbangkan juga bahwa saat ini penerapan konsep "Kursor" untuk hasil pipa agregasi adalah konsep baru untuk MongoDB. Dapat dikatakan secara adil bahwa semua harapan "masuk akal" pada titik desain pertama adalah bahwa "sebagian besar" hasil dari penggabungan dokumen tidak akan berukuran yang membatasi batasan BSON. Namun seiring dengan meluasnya penggunaan, maka persepsi berubah dan segala sesuatunya berubah untuk beradaptasi.

Jadi ini "bisa" mungkin diubah, tetapi bukan bagaimana "saat ini" diterapkan. Sementara .count() pada implementasi kursor standar memiliki akses ke "meta data" tempat nomor yang dipindai direkam, metode apa pun pada implementasi saat ini akan menghasilkan pengambilan semua hasil kursor, seperti .itcount() tidak di shell.

Proses item "kursor" dengan mengandalkan peristiwa "data" dan memancarkan sesuatu (mungkin generator aliran JSON) sebagai "hitungan" di bagian akhir. Untuk kasus penggunaan apa pun yang memerlukan penghitungan "di muka", itu tidak akan tampak seperti penggunaan kursor yang valid, karena tentunya outputnya akan menjadi seluruh dokumen dengan ukuran yang masuk akal.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Membuat Kunci Unik MongoDB dengan C#

  2. Bagaimana cara meneruskan argumen ke Skrip Mongo

  3. Loopback:filter dekat pada sub-bidang objek

  4. Tidak bisa membuat Passport.js berfungsi

  5. Bagaimana Memulihkan Dari Rollback MongoDB?