Konsep umum "paging" adalah menggunakan .skip()
yang pada dasarnya "melompati" hasil yang telah diambil, jadi pada dasarnya Anda dapat melakukan ini:
var q = Post.find().sort( "rating" ).skip(10).limit(10);
Tapi sungguh, seperti yang dapat Anda bayangkan, ini akan sangat melambat ketika Anda memasukkan beberapa "halaman". Jadi, Anda benar-benar menginginkan sesuatu yang lebih cerdas. Pada dasarnya ini adalah "kueri rentang" di mana Anda ingin mengambil hasil yang lebih tinggi (atau lebih rendah jika menurun) daripada kumpulan hasil terakhir yang diambil. Jadi diberi nilai terakhir 5
maka untuk lebih besar dari yang Anda lakukan:
var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);
Terlihat Oke, tapi sebenarnya masih ada masalah. Bagaimana jika "halaman" berikutnya juga berisi hasil dengan peringkat 5? Kueri ini akan melewatinya dan tidak pernah menampilkannya.
Hal cerdas yang harus dilakukan adalah "menyimpan" semua _id
nilai dari dokumen karena mereka adalah kunci unik. Pada dasarnya menerapkan hal yang sama, kecuali kali ini Anda memastikan bahwa Anda tidak memasukkan hasil dari halaman sebelumnya ke halaman baru Anda. $nin
operator membantu di sini:
var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
.sort( "rating" ).limit(10);
Apakah seenIds
hanya halaman terakhir dari hasil atau lebih tergantung pada "kepadatan" dari nilai yang Anda urutkan, dan tentu saja Anda perlu "menyimpan" ini dalam variabel sesi atau sesuatu.
Namun cobalah untuk menyesuaikan ini, karena kueri rentang biasanya merupakan hasil performa terbaik Anda.