API: Пагинация
Документация класса PaginatedResult для работы с постраничной навигацией.
Получение PaginatedResult
typescript
const result = await Model.findManyPaginated(options, page, perPage)Свойства
data
Тип: T[]
Массив документов текущей страницы.
typescript
const result = await User.findManyPaginated({}, 1, 10)
console.log(result.data) // Array<User>state
Тип: PaginationState
Объект с информацией о состоянии пагинации.
typescript
interface PaginationState {
skip: number // количество пропущенных документов
limit: number // документов на страницу
page: number // текущая страница
total: number // всего документов
totalPages: number // всего страниц
left: number // осталось документов
}Пример
typescript
const result = await User.findManyPaginated({}, 2, 10)
console.log(result.state.page) // 2
console.log(result.state.total) // 95
console.log(result.state.totalPages) // 10
console.log(result.state.limit) // 10
console.log(result.state.skip) // 10
console.log(result.state.left) // 75options
Тип: FindManyOptions | {}
Опции, переданные при запросе.
Методы
next()
Переходит к следующей странице.
typescript
next(): Promise<PaginatedResult<T>>Возвращает: this (текущий экземпляр с обновлёнными данными).
typescript
const result = await User.findManyPaginated({}, 1, 10)
console.log(result.state.page) // 1
await result.next()
console.log(result.state.page) // 2
console.log(result.data) // данные страницы 2previous()
Переходит к предыдущей странице.
typescript
previous(): Promise<PaginatedResult<T>>Возвращает: this (текущий экземпляр с обновлёнными данными).
Ошибка на первой странице
Вызов previous() на первой странице выбросит ошибку.
typescript
const result = await User.findManyPaginated({}, 3, 10)
await result.previous()
console.log(result.state.page) // 2
await result.previous()
console.log(result.state.page) // 1
// Ошибка!
await result.previous() // Error: Page cannot be lower than 1TypeScript типы
PaginatedResult<T>
typescript
class PaginatedResult<T = {}> {
state: PaginationState
data: Array<T>
options: FindManyOptions | {}
next(): Promise<PaginatedResult<T>>
previous(): Promise<PaginatedResult<T>>
}PaginationState
typescript
interface PaginationState {
skip: number
limit: number
page: number
total: number
totalPages: number
left: number
}FindManyOptions
typescript
interface FindManyOptions {
page: number
perPage: number
search?: string
sort?: string
fields?: string[]
}Примеры использования
Проверка наличия страниц
typescript
const result = await User.findManyPaginated({}, 1, 10)
const hasNextPage = result.state.page < result.state.totalPages
const hasPrevPage = result.state.page > 1
console.log('Есть следующая:', hasNextPage)
console.log('Есть предыдущая:', hasPrevPage)Отображение информации о пагинации
typescript
const result = await User.findManyPaginated({}, 2, 10)
const { page, totalPages, total, limit } = result.state
const from = (page - 1) * limit + 1
const to = Math.min(page * limit, total)
console.log(`Показаны записи ${from}-${to} из ${total}`)
// "Показаны записи 11-20 из 95"Навигация по всем страницам
typescript
async function getAllPages<T>(model: any, options = {}, perPage = 100) {
const allItems: T[] = []
let result = await model.findManyPaginated(options, 1, perPage)
allItems.push(...result.data)
while (result.state.page < result.state.totalPages) {
await result.next()
allItems.push(...result.data)
}
return allItems
}
// Использование
const allUsers = await getAllPages(User, { sort: 'name' }, 100)Генератор страниц
typescript
async function* pageGenerator<T>(model: any, options = {}, perPage = 25) {
let page = 1
let hasMore = true
while (hasMore) {
const result = await model.findManyPaginated(options, page, perPage)
yield result.data
hasMore = result.state.page < result.state.totalPages
page++
}
}
// Использование
for await (const pageData of pageGenerator(User)) {
console.log(`Загружена страница с ${pageData.length} пользователями`)
// Обработка данных...
}