MongoDB sortira rezultate upita sa sort i paginira sa limit i skip — ulančani na find kursor. Zajedno rukuju poretkom i vraćanjem stranica podataka, što je neophodno za prikaz rezultata.
MongoDB sortira rezultate upita sa sort i paginira sa limit i skip — ulančani na find kursor. Zajedno rukuju poretkom i vraćanjem stranica podataka, što je neophodno za prikaz rezultata.
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 prima dokument sa field:direction (1 uzlazno, -1 silazno). Više polja omogućava odvajanje veza.
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) vraća najviše n dokumenata; skip(m) preskače prvih m. Zajedno implementiraju offset paginaciju (stranica N putem 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);
Bez sort, redoslijed dokumenata nije garantiran, pa paginisane stranice mogu biti nekonzistentne. Uvijek sortiraj prema stabilnom polju (poput _id) pri paginaciji.
// ⚠️ 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.
Sortiranje i paginacija su temeljni za korisno prikazivanje podataka u MongoDB-u — sortiranje rezultata i vraćanje upravljivih stranica su gotovo univerzalne potrebe (bilo koja lista, feed ili tablica u aplikaciji), pa je razumijevanje toga bitno svakodnevno znanje.
Znanje sort (sortiranje po poljima sa 1/-1, sa odvajanjem veza) i limit/skip (za offset paginaciju — vraćanje stranica podataka) pokriva česte potrebe za prikazom rezultata upita.
Dve praktične točke su posebno važne: uvijek sortiraj pri paginaciji (bez toga, redoslijed dokumenata nije garantiran, što uzrokuje nekonzistentne stranice koje se mogu preklapati ili preskakati dokumente — pravi bug, isti problem kao u SQL-u), i razumijevanje da je skip spora na dubokim stranicama (mora skenirati i preskakati sve prethodne dokumente) — pa je paginacija temeljena na rasponu (kursor) (korištenje zadnje viđenog _id za dohvat sljedeće stranice, iskorištavanje indeksa bez preskakanja) daleko učinkovitija za velike skupove podataka, vrijedna tehnike performansi.
Znanje da je sortiranje na indeksiranim poljima učinkovito dok veliki neindeksirani sortiranja mogu biti spora ili neuspješna (ograničenja in-memory sortiranja) je takođe važno — indeksiraj polja po kojima sortirate.
Budući da su sortiranje i paginacija potrebni za gotovo bilo koji prikaz podataka, i budući da zahtjev za konzistencijom (sortiranje za stabilnu paginaciju) i razmatranja performansi (skip nasuprot paginaciji temeljenja na rasponu, indeksirana sortiranja) direktno utječu na ispravnost i brzinu, razumijevanje MongoDB-ovog sortiranja i paginacije — sort, offset paginacija sa skip/limit, zahtjev za stabilno sortiranje, učinkovita alternativa temeljena na rasponu i indeksiranje poljasortiganja — je bitno, često primjenjivo znanje za izgradnju aplikacija koje učinkovito i efikasno prikazuju MongoDB podatke.