Перейти к содержимому

10. Сортировка и пагинация

Для работы с большими наборами данных в Prisma используются операторы orderBy, skip, take и курсорная пагинация. Правильная пагинация критически важна для производительности приложения.

// Сортировка по одному полю
const users = await prisma.user.findMany({
orderBy: { createdAt: 'desc' },
})
// Сортировка по нескольким полям
const users = await prisma.user.findMany({
orderBy: [
{ lastName: 'asc' },
{ firstName: 'asc' },
],
})

Классический подход с skip и take:

const pageSize = 10
const page = 2
const users = await prisma.user.findMany({
skip: (page - 1) * pageSize, // пропустить N записей
take: pageSize, // взять N записей
orderBy: { id: 'asc' },
})
// Получить общее количество для UI
const total = await prisma.user.count()

Эффективнее для больших наборов данных и бесконечной прокрутки:

// Первая страница
const firstPage = await prisma.user.findMany({
take: 10,
orderBy: { id: 'asc' },
})
// Следующая страница (после последнего элемента)
const lastId = firstPage[firstPage.length - 1].id
const nextPage = await prisma.user.findMany({
take: 10,
skip: 1,
cursor: { id: lastId },
orderBy: { id: 'asc' },
})
КритерийOffsetCursor
Простота реализации✅ Просто⚠️ Сложнее
Перфоманс на больших данных❌ Медленнее✅ Быстрее
Стабильность при изменении данных❌ Нестабильная✅ Стабильная
Произвольный переход на страницу✅ Да❌ Нет