MongoDB предоставляет два основных подхода к пагинации: на основе смещения и на основе курсора. Каждый имеет разные характеристики производительности в зависимости от размера набора данных.
Самый простой метод использует skip() и limit():
// Страница 3 с 10 элементами на странице
db.users.find().sort({ _id: 1 }).skip(20).limit(10)
skip(n) говорит MongoDB пропустить первые n документовlimit(n) ограничивает количество возвращаемых документовБолее производительная альтернатива использует фильтр по диапазону на индексированном поле:
// Получить следующие 10 элементов после последнего увиденного _id
db.users.find({ _id: { $gt: lastSeenId } }).sort({ _id: 1 }).limit(10)
_id напрямую, избегая сканирования документовskip() — MongoDB должна отсканировать и отбросить все пропущенные документы, что становится всё медленнее по мере роста номера страницыsort() на индексированном поле, чтобы избежать полного сканирования коллекции| Сценарий | Рекомендуемый подход |
|---|---|
| Небольшие объёмы данных / админ-панели | skip() + limit() |
| Большие объёмы данных / бесконечный скролл | Пагинация на основе курсора |
Для production-систем с большими коллекциями пагинация на основе курсора настоятельно рекомендуется благодаря предсказуемой и стабильной производительности.
Метод skip() в MongoDB поддерживает стабильную производительность независимо от количества пропускаемых документов, что делает его идеальным для пагинации больших наборов данных.
Новый — ещё не проверен сообществом
Вы