Mongo: Aggregation with Pagination
Допустим у нас есть такая коллекция users в Mongo DB:
[ |
И мы хотим организовать просмотр всех контактов всех пользователей в одной таблице с разбивкой по страницам (“pagination”). То есть так:
Чтобы получить все контакты можно воспользоваться aggregation с $unwind.
Еще нам нужно посчитать количество всех контактов, после чего “вырезать” только те, которые нужно показать в выбранной странице. Для того, чтобы выполнить обе эти операции одним запросом, воспользуемся чудесной пайплайн-стадией $facet. Получится так:
db.collection('users').aggregate([ |
page_size - это количество записей на странице.
firstRow - это номер первой записи на странице. Вычисляется он так:
const firstRow = (page > 0 ? ((page-1) * page_size) : 0) + 1; |
Вместо $unwind могут быть другие пайплайн-стадии, которые выбирают нужные для показа данные. Основной же прием, который я хотел продемонстрировать в этом посте, - это использование $facet.
Полный пример можно посмотреть на github:
- сервер на nodejs: https://github.com/coolsoftware/node-mongo-aggregation-pagination
- клиент на react: https://github.com/coolsoftware/react-mongo-aggregation-pagination
===
Перепечатка материалов блога разрешается с обязательной ссылкой на blog.coolsoftware.ru