Mongo Mapper (который я предполагаю, что вы используете из-за синтаксиса вашего запроса) реализует это с помощью выражений limit и skip выражений.
По сути, он запускает запрос, где пропускает количество каналов, а затем извлекает сумму, указанную лимитом (число, которое вы получаете за страницу).
Например: если вы были на странице 3 и у вас по 25 на страницу, запрос, который запускает mongo mapper, выглядит следующим образом:
db.channels.find().skip((page - 1) * per_page).limit(per_page)
Что означает:
db.channels.find().skip(2 * 25).limit(25)
Чтобы вернуть результаты, Mongo должен пропустить (page - 1) * per_page
количество результатов, которое может быть дорогостоящим, если номер страницы большой. Допустим, выражение выражается как 1000, тогда ему нужно будет выполнить запрос, пропустить более 1000 документов и получить следующие 25 документов (ограничение). MongoDB, по сути, будет выполнять сканирование таблицы этих документов.
Чтобы избежать этого, вы можете использовать разбивку на страницы диапазона, которая обеспечивает лучшее использование индексов, но не позволяет легко переходить на определенную страницу.
Если модель канала имеет, например, поле даты, то при поиске по диапазонам вместо пропуска используются $ gte и limit. Вы должны взять дату последнего документа на странице x и получить результаты следующей страницы, запросив документы с датой $ gte окончательного документа предыдущей страницы. Если вы сделаете это, вы можете получить обманщиков, поэтому имеет смысл использовать другие критерии.
На практике не беспокойтесь об этом, если у вас не очень много страниц.
Ура и удачи!