MongoDB sorterer spørringsresultater med sort og paginerer med limit og skip — lenket på en find-cursor. Sammen håndterer de sortering og returnering av datasider, noe som er essensielt for å vise resultater.
sort — sorter resultater
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 tar et dokument med felt:retning (1 stigende, -1 synkende). Flere felt gir oppløsning av uavgjort.
limit og skip — paginering
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) returnerer høyst n dokumenter; skip(m) hopper over de første m. Sammen implementerer de offset-paginering (side N via skip + limit).
Sorter alltid ved paginering
// ❌ 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);
Uten sort er dokumentrekkefølgen ikke garantert, så paginerte sider kan være inkonsistente. Sorter alltid etter et stabilt felt (som _id) ved paginering.
skip er treg på dype sider — bruk område-basert paginering
// ⚠️ 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)
Sortering og indekser
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.
Hvorfor det har betydning
Sortering og paginering er grunnleggende for å vise data nyttig i MongoDB — å sortere resultater og returnere håndterbare sider er nesten universelle behov (enhver liste, feed eller tabell i en applikasjon), så forståelse av disse er essensielt daglig kunnskap.
Kunnskapen om sort (sortering etter felt med 1/-1, med oppløsning av uavgjort) og limit/skip (for offset-paginering — returnering av datasider) dekker de vanlige behovene for presentasjon av spørringsresultater.
To praktiske poenger er særlig viktige: sorter alltid ved paginering (uten det er dokumentrekkefølgen ikke garantert, som forårsaker inkonsistente sider som overlapper eller hopper over dokumenter — en reell feil, samme problem som i SQL), og forståelse av at skip er treg på dype sider (den må skanne og hoppe over alle foregående dokumenter) — så område-basert (cursor) paginering (bruke siste sett _id for å hente neste side, utnytte indeksen uten å hoppe) er langt mer effektiv for store datasett, en verdifull ytelses-teknikk.
Kunnskapen om at sortering på indekserte felt er effektiv mens store uindekserte sorteringer kan være trage eller mislykkes (minnesort-grenser) er også viktig — indekser felt du sorterer på.
Siden sortering og paginering er påkrevd for praktisk talt all datapresentasjon, og siden konsistenskravet (sorter for stabil paginering) og ytelses-hensyn (skip vs område-basert paginering, indekserte sorteringer) direkte påvirker korrekthet og hastighet, er forståelse av MongoDB sortering og paginering — sort, offset-paginering med skip/limit, stabilt sorterings-krav, det effektive område-baserte alternativet, og indeksering av sorteringsfelt — essensielt, hyppig brukt kunnskap for å bygge applikasjoner som presenterer MongoDB-data effektivt og performant.
