MongoDB sortuje wyniki zapytań za pomocą sort i paginuje za pomocą limit oraz skip — łańcuchowanych na kursorze find. Razem obsługują porządkowanie i zwracanie stron danych, co jest niezbędne do wyświetlania wyników.
MongoDB sortuje wyniki zapytań za pomocą sort i paginuje za pomocą limit oraz skip — łańcuchowanych na kursorze find. Razem obsługują porządkowanie i zwracanie stron danych, co jest niezbędne do wyświetlania wyników.
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 przyjmuje dokument pola:kierunek (1 rosnąco, -1 malejąco). Wiele pól zapewnia rozstrzyganie remisów.
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) zwraca co najwyżej n dokumentów; skip(m) pomija pierwsze m. Razem implementują paginację z przesunięciem (strona N poprzez 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, kolejność dokumentów nie jest gwarantowana, więc strony paginowane mogą być niespójne. Zawsze sortuj po stabilnym polu (jak _id) przy paginacji.
// ⚠️ 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.
Sortowanie i paginacja są fundamentalne dla wyświetlania danych w użyteczny sposób w MongoDB — porządkowanie wyników i zwracanie zarządzalnych stron są potrzebami uniwersalnymi (dowolna lista, feed lub tabela w aplikacji), dlatego zrozumienie ich jest niezbędną wiedzą codzienną.
Znajomość sort (porządkowania pól za pomocą 1/-1, z rozstrzyganiem remisów) i limit/skip (do paginacji z przesunięciem — zwracania stron danych) obejmuje typowe potrzeby prezentacji wyników zapytań.
Dwa praktyczne punkty są szczególnie ważne: zawsze sortuj przy paginacji (bez tego kolejność dokumentów nie jest gwarantowana, co powoduje niespójne strony, które mogą się nakładać lub pomijać dokumenty — rzeczywisty błąd, ten sam problem co w SQL), oraz zrozumienie, że skip jest wolny na głębokich stronach (musi skanować i pomijać wszystkie poprzedzające dokumenty) — dlatego paginacja oparta na zakresach (kursor) (używająca ostatniego widzianego _id do pobrania następnej strony, wykorzystując indeks bez pomijania) jest znacznie bardziej wydajna dla dużych zbiorów danych, cenna technika wydajności.
Znajomość tego, że sortowanie na polach indeksowanych jest wydajne, podczas gdy duże sortowania nieindeksowane mogą być wolne lub zawieść (limity sortowania w pamięci), jest także ważna — indeksuj pola, po których sortujesz.
Ponieważ sortowanie i paginacja są wymagane dla praktycznie każdego wyświetlania danych, a ponieważ wymóg spójności (sort dla stabilnej paginacji) i rozważania wydajności (skip vs paginacja oparta na zakresach, sortowania indeksowane) bezpośrednio wpływają na poprawność i szybkość, zrozumienie sortowania i paginacji MongoDB — sort, paginacja z przesunięciem skip/limit, wymóg stabilnego sortowania, efektywna alternatywa oparta na zakresach i indeksowanie pól sortowania — jest niezbędną, często stosowaną wiedzą do budowania aplikacji, które prezentują dane MongoDB efektywnie i wydajnie.