MongoDB mengisih hasil pertanyaan dengan sort dan menomborkan halaman dengan limit dan skip — dirantai pada kursor find. Bersama-sama ia mengendalikan pengurutan dan mengembalikan halaman data, penting untuk memaparkan hasil.
MongoDB mengisih hasil pertanyaan dengan sort dan menomborkan halaman dengan limit dan skip — dirantai pada kursor find. Bersama-sama ia mengendalikan pengurutan dan mengembalikan halaman data, penting untuk memaparkan 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 mengambil dokumen medan:arah (1 menaik, -1 menurun). Berbilang medan menyediakan pemecah seri.
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) melangkau m yang pertama. Bersama-sama ia melaksanakan penomboran halaman ofset (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, jadi halaman yang dinomborkan boleh menjadi tidak konsisten. Sentiasa isih mengikut medan yang stabil (seperti _id) semasa menomborkan halaman.
// ⚠️ 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.
Pengisihan dan penomboran halaman adalah asas untuk memaparkan data dengan berguna dalam MongoDB — mengurutkan hasil dan mengembalikan halaman yang boleh diurus ialah keperluan hampir universal (sebarang senarai, suapan, atau jadual dalam aplikasi), jadi memahaminya ialah pengetahuan harian yang penting.
Mengetahui sort (mengurutkan mengikut medan dengan 1/-1, dengan pemecah seri) dan limit/skip (untuk penomboran halaman ofset — mengembalikan halaman data) merangkumi keperluan biasa untuk mempersembahkan hasil pertanyaan.
Dua perkara praktikal amat penting: sentiasa isih semasa menomborkan halaman (tanpanya, urutan dokumen tidak dijamin, menyebabkan halaman tidak konsisten yang bertindih atau melangkau dokumen — pepijat sebenar, isu yang sama seperti dalam SQL), dan memahami bahawa skip adalah perlahan pada halaman dalam (ia mesti mengimbas dan melangkau semua dokumen sebelumnya) — jadi penomboran halaman berasaskan julat (kursor) (menggunakan _id terakhir yang dilihat untuk mendapatkan halaman seterusnya, memanfaatkan indeks tanpa melangkau) adalah jauh lebih cekap untuk set data besar, satu teknik prestasi yang berharga.
Mengetahui bahawa pengisihan pada medan berindeks adalah cekap manakala pengisihan besar tanpa indeks boleh menjadi perlahan atau gagal (had pengisihan dalam memori) juga penting — indekskan medan yang anda isih.
Memandangkan pengisihan dan penomboran halaman diperlukan untuk hampir semua paparan data, dan memandangkan keperluan konsistensi (isih untuk penomboran halaman yang stabil) dan pertimbangan prestasi (skip vs penomboran berasaskan julat, pengisihan berindeks) secara langsung memberi kesan kepada ketepatan dan kelajuan, memahami pengisihan dan penomboran halaman MongoDB — sort, penomboran halaman ofset dengan skip/limit, keperluan isih-stabil, alternatif berasaskan julat yang cekap, dan mengindeks medan isih — ialah pengetahuan penting dan kerap digunakan untuk membina aplikasi yang mempersembahkan data MongoDB dengan berkesan dan berprestasi.