MongoDB mengurutkan hasil query dengan sort dan melakukan paginasi dengan limit dan skip — dirantai pada cursor find. Bersama-sama mereka menangani pengurutan dan mengembalikan halaman data, yang penting untuk menampilkan hasil.
MongoDB mengurutkan hasil query dengan sort dan melakukan paginasi dengan limit dan skip — dirantai pada cursor find. Bersama-sama mereka menangani pengurutan dan mengembalikan halaman data, yang penting untuk menampilkan hasil.
db.users.find().sort({ age: 1 }); // ascending by age (1 = asc)
db.users.find().sort({ age: -1 }); // descending (-1 = desc)
db.users.find().sort({ country: 1, name: 1 }); // by country, then name (tie-break)
db.users.find().sort({ createdAt: -1 }); // newest first (common)
sort menerima dokumen field:direction (1 ascending, -1 descending). Beberapa field memberikan tie-breaking.
db.users.find().sort({ name: 1 }).limit(10); // first 10 (page 1)
db.users.find().sort({ name: 1 }).skip(10).limit(10); // skip 10, take 10 (page 2)
// page N: .skip((N-1) * pageSize).limit(pageSize)
limit(n) mengembalikan paling banyak n dokumen; skip(m) melewati m dokumen pertama. Bersama-sama mereka mengimplementasikan offset pagination (halaman N melalui skip + limit).
// ❌ pagination without sort → inconsistent order (pages may overlap/skip)
db.users.find().skip(10).limit(10);
// ✅ sort by a stable field for consistent pages
db.users.find().sort({ _id: 1 }).skip(10).limit(10);
Tanpa sort, urutan dokumen tidak dijamin, sehingga halaman yang dipaginasi dapat tidak konsisten. Selalu urutkan berdasarkan field yang stabil (seperti _id) saat melakukan paginasi.
// ⚠️ skip(1000000) must scan/skip a million docs → slow on deep pages
// ✅ range-based (cursor) pagination — far more efficient for large datasets
db.users.find({ _id: { $gt: lastSeenId } }).sort({ _id: 1 }).limit(10);
// → use the last document's _id to fetch the next page (uses the index, no skipping)
Sorting on an INDEXED field is efficient. Sorting a large result set WITHOUT an index
requires an in-memory sort (limited size — can fail/be slow for big sorts).
→ Index fields you sort by.
Pengurutan dan paginasi adalah fundamental untuk menampilkan data secara berguna di MongoDB — mengurutkan hasil dan mengembalikan halaman yang dapat dikelola adalah kebutuhan yang hampir universal (list, feed, atau table apa pun dalam aplikasi), sehingga memahaminya adalah pengetahuan esensial sehari-hari.
Mengetahui sort (pengurutan berdasarkan field dengan 1/-1, dengan tie-breaking) dan limit/skip (untuk offset pagination — mengembalikan halaman data) mencakup kebutuhan umum untuk menyajikan hasil query.
Dua poin praktis sangat penting: selalu urutkan saat melakukan paginasi (tanpanya, urutan dokumen tidak dijamin, menyebabkan halaman yang tidak konsisten yang tumpang tindih atau melewatkan dokumen — bug nyata, masalah yang sama seperti di SQL), dan memahami bahwa skip lambat pada halaman yang dalam (harus memindai dan melewati semua dokumen sebelumnya) — sehingga range-based (cursor) pagination (menggunakan _id terakhir yang terlihat untuk mengambil halaman berikutnya, memanfaatkan indeks tanpa melewatkan) jauh lebih efisien untuk dataset besar, teknik performa yang berharga.
Mengetahui bahwa pengurutan pada field yang diindeks efisien sementara pengurutan yang tidak diindeks besar dapat lambat atau gagal (batas in-memory sort) juga penting — indeks field yang Anda urutkan.
Karena pengurutan dan paginasi diperlukan untuk praktis semua tampilan data, dan karena kebutuhan konsistensi (sort untuk paginasi yang stabil) dan pertimbangan performa (skip vs range-based pagination, sort yang diindeks) secara langsung mempengaruhi kebenaran dan kecepatan, memahami pengurutan dan paginasi MongoDB — sort, offset pagination dengan skip/limit, persyaratan stable-sort, alternatif efficient range-based, dan indexing sort fields — adalah pengetahuan esensial dan sering diterapkan untuk membangun aplikasi yang menyajikan data MongoDB secara efektif dan performa.