SQL Server dan Oracle keduanya memiliki fungsi DENSE_RANK. Apakah ada cara untuk melakukan sesuatu yang serupa di MongoDB tanpa harus menggunakan MapReduce? Dengan kata lain, misalkan Anda memiliki klausa pilih T-SQL seperti ini:
SELECT DENSE_RANK() OVER(ORDER BY SomeField DESC) SomeRank
Apa cara terbaik untuk melakukan hal yang sama di MongoDB?
(Catatan: Ini adalah repost pertanyaan MongoDB di sini . Saya berharap mendapatkan lebih banyak umpan balik dari DBA ...)
sql-server
nosql
mongodb
kgriff
sumber
sumber
Jawaban:
MongoDB tidak memiliki konsep peringkat apa pun. Yang paling dekat yang bisa saya temukan berasal dari sini :
Jelas, ini jauh dari ideal. Namun, MongoDB sama sekali tidak memiliki jenis fungsi apa pun untuk ini karena itu hanya tidak dirancang untuk jenis permintaan ini.
sumber
Setelah beberapa percobaan, saya menemukan bahwa adalah mungkin untuk membangun fungsi peringkat berdasarkan MapReduce, dengan asumsi set hasil dapat sesuai dengan ukuran dokumen maks.
Sebagai contoh, misalkan saya memiliki koleksi seperti ini:
Saya dapat melakukan yang setara dengan DENSE_RANK seperti:
Sebagai perbandingan, berikut adalah pendekatan "naif" yang disebutkan di tempat lain:
Saya membandingkan kedua pendekatan pada satu contoh MongoDB 1.8.2 menggunakan kode berikut:
Sementara MapReduce lebih cepat dari yang saya harapkan, pendekatan naif meledakkannya dari air untuk ukuran pengumpulan yang lebih besar, terutama sekali cache dihangatkan:
Jadi untuk saat ini, sepertinya pendekatan naif adalah jalan yang harus ditempuh, meskipun saya akan tertarik untuk melihat apakah ceritanya berubah akhir tahun ini karena tim MongoDB terus meningkatkan kinerja MapReduce.
sumber