Paging melalui data Anda adalah salah satu operasi paling umum dengan MongoDB. Skenario tipikal adalah kebutuhan untuk menampilkan hasil Anda dalam potongan di UI Anda. Jika Anda memproses data secara batch, penting juga untuk membuat strategi paging Anda benar sehingga pemrosesan data Anda dapat diskalakan.
Mari kita telusuri sebuah contoh untuk melihat berbagai cara untuk menelusuri data di MongoDB. Dalam contoh ini, kami memiliki database CRM dari data pengguna yang kami perlukan untuk membuka halaman dan menampilkan 10 pengguna sekaligus. Jadi sebenarnya, ukuran halaman kami adalah 10. Berikut adalah struktur dokumen pengguna kami:
{ _id, name, company, state }
Pendekatan 1:Menggunakan skip() dan limit()
MongoDB secara native mendukung operasi paging menggunakan perintah skip() dan limit(). Direktif skip(n) memberi tahu MongoDB bahwa ia harus melewati hasil 'n', dan direktif limit(n) menginstruksikan MongoDB bahwa ia harus membatasi panjang hasil ke hasil 'n'. Biasanya, Anda akan menggunakan direktif skip() dan limit() dengan kursor Anda - tetapi untuk mengilustrasikan skenario, kami menyediakan perintah konsol yang akan mencapai hasil yang sama. Selain itu, untuk singkatnya kode, kode pemeriksaan batas juga dikecualikan:
//Page 1 db.users.find().limit (10) //Page 2 db.users.find().skip(10).limit(10) //Page 3 db.users.find().skip(20).limit(10) ........
Anda mendapatkan ide. Secara umum, untuk mengambil halaman 'n' kodenya terlihat seperti ini:
db.users.find().skip(pagesize*(n-1)).limit(pagesize)
Namun, seiring dengan bertambahnya ukuran data Anda, pendekatan ini memiliki masalah performa yang serius. Pasalnya, setiap kali query dieksekusi, set hasil lengkap dibangun, kemudian server harus berjalan dari awal koleksi ke offset yang ditentukan. Saat offset Anda meningkat, proses ini semakin lambat. Juga, proses ini tidak membuat penggunaan indeks secara efisien. Jadi biasanya pendekatan 'lewati()' dan 'batas()' berguna saat Anda memiliki kumpulan data kecil, dan jika Anda bekerja dengan kumpulan data besar, sebaiknya pertimbangkan pendekatan lain.
Pendekatan 2:Menggunakan find() dan limit()
Alasan pendekatan sebelumnya tidak menskalakan dengan baik adalah perintah skip(), dan tujuan di bagian ini adalah untuk mengimplementasikan paging tanpa menggunakan perintah 'skip()'. Untuk ini, kami akan memanfaatkan urutan alami dalam data yang disimpan seperti stempel waktu atau id yang disimpan dalam dokumen. Dalam contoh ini, kita akan menggunakan '_id' yang disimpan di setiap dokumen. ‘_id’ adalah struktur MongoDB ObjectID yang merupakan struktur 12-byte yang berisi timestamp, machined, processid, counter, dll. Ide keseluruhannya adalah sebagai berikut:
1. Ambil _id dari dokumen terakhir di halaman saat ini
2. Ambil dokumen yang lebih besar dari “_id” ini di halaman berikutnya
//Page 1 db.users.find().limit(pageSize); //Find the id of the last document in this page last_id = ... //Page 2 users = db.users.find({'_id'> last_id}). limit(10); //Update the last id with the id of the last document in this page last_id = ...
Pendekatan ini memanfaatkan urutan bawaan yang ada di bidang “_id”. Juga, karena bidang "_id" diindeks secara default, kinerja operasi pencarian sangat baik. Jika bidang yang Anda gunakan tidak diindeks, kinerja Anda akan terganggu – jadi penting untuk memastikan bahwa bidang tersebut diindeks.
Selain itu, jika Anda ingin data Anda diurutkan dalam urutan tertentu untuk paging Anda, maka Anda juga dapat menggunakan klausa sort() dengan teknik di atas. Penting untuk memastikan bahwa proses penyortiran memanfaatkan indeks untuk kinerja terbaik. Anda dapat menggunakan akhiran .explain() pada kueri Anda untuk menentukan ini:
users = db.users.find({'_id'> last_id}). sort(..).limit(10); //Update the last id with the id of the last document in this page last_id = ...
Seperti biasa jika Anda memiliki pertanyaan atau komentar, silakan hubungi kami di [email protected].