MongoDB sortează rezultatele interogării cu sort și pagineaza cu limit și skip — înlănțuite pe un cursor find. Împreună gestionează ordonarea și returnarea de pagini de date, esențial pentru afișarea rezultatelor.
MongoDB sortează rezultatele interogării cu sort și pagineaza cu limit și skip — înlănțuite pe un cursor find. Împreună gestionează ordonarea și returnarea de pagini de date, esențial pentru afișarea rezultatelor.
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 ia un document de câmp:direcție (1 crescător, -1 descrescător). Câmpuri multiple oferă despărțire în caz de egalitate.
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) returnează cel mult n documente; skip(m) omite primele m. Împreună implementează paginare cu offset (pagina N via 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);
Fără sort, ordinea documentelor nu este garantată, deci paginile paginată pot fi inconsistente. Întotdeauna sortați după un câmp stabil (ca _id) la paginare.
// ⚠️ 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.
Sortarea și paginarea sunt fundamentale pentru afișarea utilă a datelor în MongoDB — ordonarea rezultatelor și returnarea de pagini gestionabile sunt nevoi aproape universale (orice listă, feed sau tabel într-o aplicație), deci înțelegerea lor este cunoștințe esențiale zilnice.
Cunoașterea sort (ordonare după câmpuri cu 1/-1, cu despărțire în caz de egalitate) și limit/skip (pentru paginare cu offset — returnarea de pagini de date) acoperă nevoile comune pentru prezentarea rezultatelor interogării.
Două puncte practice sunt deosebit de importante: întotdeauna sortați la paginare (fără aceasta, ordinea documentelor nu este garantată, cauzând pagini inconsistente care se suprapun sau omit documente — un adevărat bug, aceeași problemă ca în SQL), și înțelegerea că skip este lent pe pagini adânci (trebuie să scaneze și să omită toate documentele anterioare) — deci paginarea bazată pe interval (cursor) (folosind ultimul _id văzut pentru a prelua pagina următoare, folosind indexul fără a omite) este mult mai eficientă pentru seturi de date mari, o tehnică valoroasă de performanță.
Cunoașterea că sortarea pe câmpuri indexate este eficientă în timp ce sortările mari neindexate pot fi lente sau pot eșua (limitele de sortare în memorie) este de asemenea importantă — indexați câmpurile după care sortați.
Cum sortarea și paginarea sunt necesare pentru aproape orice afișare de date, și cum cerința de consistență (sort pentru paginare stabilă) și considerentele de performanță (skip vs paginare bazată pe interval, sortări indexate) afectează direct corectitudinea și viteza, înțelegerea sortării și paginării MongoDB — sort, paginare cu offset cu skip/limit, cerința de sortare stabilă, alternativa eficientă bazată pe interval și indexarea câmpurilor de sortare — este cunoștințe esențiale, frecvent aplicate pentru construirea aplicațiilor care prezintă datele MongoDB în mod eficient și performant.