10. Сортировка и пагинация
Для работы с большими наборами данных в Prisma используются операторы orderBy, skip, take и курсорная пагинация. Правильная пагинация критически важна для производительности приложения.
Сортировка с orderBy
Заголовок раздела «Сортировка с orderBy»// Сортировка по одному полюconst users = await prisma.user.findMany({ orderBy: { createdAt: 'desc' },})
// Сортировка по нескольким полямconst users = await prisma.user.findMany({ orderBy: [ { lastName: 'asc' }, { firstName: 'asc' }, ],})Пагинация смещением (offset-based)
Заголовок раздела «Пагинация смещением (offset-based)»Классический подход с skip и take:
const pageSize = 10const page = 2
const users = await prisma.user.findMany({ skip: (page - 1) * pageSize, // пропустить N записей take: pageSize, // взять N записей orderBy: { id: 'asc' },})
// Получить общее количество для UIconst total = await prisma.user.count()Курсорная пагинация (cursor-based)
Заголовок раздела «Курсорная пагинация (cursor-based)»Эффективнее для больших наборов данных и бесконечной прокрутки:
// Первая страницаconst firstPage = await prisma.user.findMany({ take: 10, orderBy: { id: 'asc' },})
// Следующая страница (после последнего элемента)const lastId = firstPage[firstPage.length - 1].idconst nextPage = await prisma.user.findMany({ take: 10, skip: 1, cursor: { id: lastId }, orderBy: { id: 'asc' },})Сравнение подходов
Заголовок раздела «Сравнение подходов»| Критерий | Offset | Cursor |
|---|---|---|
| Простота реализации | ✅ Просто | ⚠️ Сложнее |
| Перфоманс на больших данных | ❌ Медленнее | ✅ Быстрее |
| Стабильность при изменении данных | ❌ Нестабильная | ✅ Стабильная |
| Произвольный переход на страницу | ✅ Да | ❌ Нет |