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

Perbandingan agregasi MongoDB:group(), $group dan MapReduce

Agak membingungkan karena namanya mirip, tetapi group() perintah adalah fitur dan implementasi yang berbeda dari $group operator pipa di Kerangka Agregasi.

Perintah group(), Aggregation Framework, dan MapReduce secara kolektif fitur agregasi dari MongoDB. Ada beberapa fitur yang tumpang tindih, tetapi saya akan mencoba menjelaskan perbedaan dan batasan masing-masing seperti di MongoDB 2.2.0.

Catatan:kumpulan hasil sebaris disebutkan di bawah merujuk ke kueri yang diproses dalam memori dengan hasil yang dikembalikan pada akhir pemanggilan fungsi. Opsi keluaran alternatif (saat ini hanya tersedia dengan MapReduce) dapat mencakup penyimpanan hasil ke koleksi baru atau yang sudah ada.

group() Perintah

  • Sintaks dan fungsionalitas sederhana untuk pengelompokan .. analog dengan GROUP BY dalam SQL.

  • Mengembalikan hasil yang disetel sebaris (sebagai larik item yang dikelompokkan).

  • Diimplementasikan menggunakan mesin JavaScript; kustom reduce() fungsi dapat ditulis dalam JavaScript.

  • Batasan Saat Ini

    • Tidak akan dikelompokkan ke dalam kumpulan hasil dengan lebih dari 20.000 kunci.

    • Hasil harus sesuai dengan batasan dokumen BSON (saat ini 16 MB).

    • Mengambil kunci baca dan tidak mengizinkan utas lain untuk mengeksekusi JavaScript saat sedang berjalan.

    • Tidak berfungsi dengan koleksi yang di-shard.

  • Lihat juga:contoh perintah group() .

MapReduce

  • Menerapkan model MapReduce untuk memproses kumpulan data besar.

  • Dapat memilih salah satu dari beberapa opsi keluaran (sebaris, koleksi baru, gabungkan, ganti, kurangi)

  • Fungsi MapReduce ditulis dalam JavaScript.

  • Mendukung koleksi input yang tidak di-sharding dan yang di-sharding.

  • Dapat digunakan untuk agregasi tambahan pada koleksi besar.

  • MongoDB 2.2 mengimplementasikan dukungan yang jauh lebih baik untuk hasil pengurangan peta sharded.

  • Batasan Saat Ini

    • Satu pancaran hanya dapat menampung setengah dari ukuran dokumen BSON maksimum MongoDB (16MB).

    • Ada kunci JavaScript sehingga server mongod hanya dapat menjalankan satu fungsi JavaScript pada satu waktu .. namun, sebagian besar langkah MapReduce sangat singkat sehingga kunci dapat sering dihasilkan.

    • Fungsi MapReduce bisa sulit untuk di-debug. Anda dapat menggunakan print() dan printjson() untuk memasukkan keluaran diagnostik dalam mongod log.

    • MapReduce umumnya tidak intuitif bagi programmer yang mencoba menerjemahkan pengalaman agregasi kueri relasional.

  • Lihat juga:Peta/Kurangi contoh .

Kerangka Agregasi

  • Fitur baru dalam rilis produksi MongoDB 2.2.0 (Agustus 2012).

  • Dirancang dengan tujuan khusus untuk meningkatkan kinerja dan kegunaan.

  • Mengembalikan hasil yang disetel sebaris.

  • Mendukung koleksi input yang tidak di-sharding dan yang di-sharding.

  • Menggunakan pendekatan "pipeline" di mana objek ditransformasikan saat mereka melewati serangkaian operator pipeline seperti pencocokan, memproyeksikan, menyortir, dan mengelompokkan.

  • Operator saluran pipa tidak perlu menghasilkan satu dokumen keluaran untuk setiap dokumen masukan:operator juga dapat membuat dokumen baru atau menyaring dokumen.

  • Dengan menggunakan proyeksi, Anda dapat menambahkan bidang yang dihitung, membuat sub-objek virtual baru, dan mengekstrak sub-bidang ke hasil tingkat atas.

  • Operator saluran pipa dapat diulang sesuai kebutuhan (misalnya, beberapa $project atau $group langkah.

  • Batasan Saat Ini

    • Hasil dikembalikan sebaris, jadi terbatas pada ukuran dokumen maksimum yang didukung oleh server (16MB)

    • Tidak mendukung opsi keluaran sebanyak MapReduce

    • Terbatas untuk operator dan ekspresi yang didukung oleh Kerangka Agregasi (yaitu tidak dapat menulis fungsi khusus)

    • Fitur server terbaru untuk agregasi, sehingga memiliki lebih banyak ruang untuk matang dalam hal dokumentasi, set fitur, dan penggunaan.

  • Lihat juga:Contoh Kerangka Kerja Agregasi .

Dapatkah seseorang memberikan ilustrasi atau memandu saya ke tautan di mana ketiga konsep ini dijelaskan bersama-sama, dengan mengambil data sampel yang sama, sehingga saya dapat membandingkannya dengan mudah?

Anda biasanya tidak akan menemukan contoh di mana akan berguna untuk membandingkan ketiga pendekatan, tetapi berikut adalah pertanyaan StackOverflow sebelumnya yang menunjukkan variasi:

  • group() versus Kerangka Agregasi
  • Kerangka MapReduce versus Agregasi



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB $acosh

  2. Menanyakan objek yang disematkan di Mongoid/rails 3 (Lebih rendah dari, operator Min, dan pengurutan)

  3. JSON membuat serial Mongodb

  4. String proyek agregasi MongoDB ke ObjectId

  5. MongoDB $isNumber