MongoDB rūšiuoja užklausos rezultatus naudodama sort ir puslapijuoja naudodama limit bei skip — sujungtas į find kursorių. Kartu jie tvarko rezultatų rūšiavimą ir grąžina duomenų puslapius, kas yra būtina rezultatams rodyti.
MongoDB rūšiuoja užklausos rezultatus naudodama sort ir puslapijuoja naudodama limit bei skip — sujungtas į find kursorių. Kartu jie tvarko rezultatų rūšiavimą ir grąžina duomenų puslapius, kas yra būtina rezultatams rodyti.
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 priima dokumentą su lauko:kryptimi (1 didėjimo tvarka, -1 mažėjimo tvarka). Keli laukai suteikia ryšio laužymą.
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) grąžina ne daugiau kaip n dokumentų; skip(m) praleiskia pirmausius m. Kartu jie diegia poslinkio puslapiavimą (puslapį N per 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);
Be sort, dokumentų tvarka nėra garantuota, todėl puslapijuoti puslapiai gali būti nesuderinti. Visada rūšiuokite pagal stabilų lauką (pvz., _id) puslapijuodami.
// ⚠️ 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.
Rūšiavimas ir puslapiavimas yra pagrindiniai duomenų naudingam rodymui MongoDB — rezultatų rūšiavimas ir valdomų puslapių grąžinimas yra beveik universalūs poreikiai (bet koks sąrašas, žmogaus srautas arba lentelė programoje), todėl jų supratimas yra būtina kasdienė žinias.
Žinojimas apie sort (lauko rūšiavimas su 1/-1, su ryšio laužymu) ir limit/skip (už poslinkio puslapiavimo — duomenų puslapių grąžinimo) apima įprastus poreikius užklausos rezultatams pateikti.
Du praktiniai punktai yra ypač svarbūs: visada rūšiuokite puslapijuodami (be to, dokumentų tvarka nėra garantuota, todėl gaunami nesuderinti puslapiai, kurie persideda arba praleiskite dokumentus — tikra baisena, tas pats dalykas kaip SQL), ir supratimas, kad skip yra lėtas giluose puslapiuose (jis turi nuskaityti ir praleisti visus ankstesnius dokumentus) — todėl diapazo pagrindu (kursorinį) puslapiavimą (naudojant paskutinį matomą _id kito puslapio suradinimui, panaudojant indeksą be praleidimu) yra daug efektyvesnis dideliem duomenų rinkiniams, vertinga našumo technika.
Žinojimas, kad rūšiavimas iš indeksuotų laukų yra efektyvus, o dideli neindeksuoti rūšiavimai gali būti lėti arba nepavykti (atminties rūšiavimo ribos) — taip pat svarbu — indeksuokite laukus, pagal kuriuos rūšiuojate.
Kadangi rūšiavimas ir puslapiavimas yra būtini beveik bet kokiam duomenų rodymui, ir kadangi dėl nuoseklumo reikalavimo (rūšiavimas stabiliam puslapiavimui) ir našumo svarstvmo (skip prieš diapazo pagrindu puslapiavimą, indeksuoti rūšiavimus) tiesiogiai atsiskaitomi į teisingumą ir greitį, MongoDB rūšiavimo ir puslapiavimo supratimas — sort, poslinkio puslapiavimas su skip/limit, stabili rūšiavimo sąlyga, efektyvus diapazo pagrindu alternatyva, ir indeksavimas rūšiavimo laukų — yra būtinas, dažnai taikomas žinias sukūrimui programų, pateikiančios MongoDB duomenis efektyviai ir našiai.