#mongodb #pagination
#mongodb #разбивка на страницы
Вопрос:
Я слышал, что использование функции skip() MongoDB для пакетных результатов запроса — плохая идея, потому что это может привести к тому, что сервер станет привязанным к вводу-выводу, поскольку он должен «просматривать» все результаты. Я хочу возвращать не более 200 документов одновременно, и тогда пользователь сможет получить следующие 200, если захочет (при условии, что они не ограничили его меньшим).
Изначально я читал о результатах разбивки на страницы, и в большинстве прочитанных мной материалов говорилось, что самый простой способ, по крайней мере в MongoDB, — это изменить критерии запроса для имитации пропуска.
Например, если поле с именем account number в последнем документе равно 28022004, то следующий запрос должен иметь «AccNumber> 28022004» в критериях. Но что, если в проекции нет уникальных полей? Что, если пользователь хочет отсортировать записи по неуникальному полю?
Комментарии:
1. Документация и исследования укажут на то, что перелистывание большого количества страниц таким образом является проблемой. В принципе, вы не хотите «пропускать» 100 000 документов, чтобы перейти к следующей странице. Запросы диапазона предпочтительны, но иногда невозможны, когда вы приходите к. Общий случай таков: «насколько глубоко» собираются зайти ваши пользователи? Если важно, чтобы они очень часто заходили очень глубоко, тогда разработайте стратегию для эффективной страницы. На данный момент это может быть довольно широкая тема. Несколько сотен пропусков действительно не сильно повлияют на ситуацию.
2. В зависимости от того, какую технологию вы используете для создания своего приложения, вы можете сохранить курсор базы данных в памяти и читать записи
next()
.3. Как насчет добавления (в качестве последнего критерия сортировки) сортировки по значению ID? Например, если две записи, в которых первая «партия» отсекается, имеют одинаковое значение для первого поля сортировки, тогда они сортируются по значению ID ? Поскольку идентификатор всегда будет уникальным, будет ли это работать?