MongoDB нумерация страниц с использованием курсоров без сортировки - PullRequest
0 голосов
/ 31 октября 2019

При поиске методов нумерации страниц в Интернете обычно можно найти два способа:

  • Пагинация на основе смещения:
Collection.find(
  { where_this: "equals that" },
  { skip: 15, limit: 5 }
) 
  • На основе курсоранумерация страниц:
Collection.find(
  { where_this: "equals that", _id: { $gt: cursor }},
  { sort: { _id: 1 }}
) 

Но есть ли способ сделать пагинацию на основе курсора без сортировки коллекции по этому курсору? Например, говоря Монго: «Хорошо, я хочу 5 следующих предметов после этого _id, независимо от того, в каком порядке находятся _id, просто дайте мне 5 предметов после того, как вы увидите, что _id». Что-то в этом роде:

Collection.find(
  { where_this: "equals that", _id: { $must_come_after: cursor }},
  { sort: { other_field: 1 }}
) 

Не всегда возможно использовать поле, с которым вы сортируете, в качестве курсора. Прежде всего, потому что эти поля могут быть разных типов, и вы можете позволить пользователям вашего приложения сортировать, например, таблицы по своему усмотрению. При использовании строго типизированной структуры API, такой как GraphQL, это было бы неразберихой. Во-вторых, у вас может быть два или более одинаковых значения для этого поля, следующих друг за другом в отсортированной коллекции. Если ваши страницы разбиваются посередине, запрос следующей страницы приведет к дублированию или игнорированию элементов.

Есть ли способ сделать это? Как это обычно делается, чтобы разрешить настраиваемую сортировку полей без нумерации на основе смещенияСпасибо.

1 Ответ

0 голосов
/ 31 октября 2019

Когда мы говорим о «разбиении на страницы набора результатов», подразумевается, что набор результатов остается неизменным на протяжении всего процесса. Чтобы набор результатов оставался прежним, он должен быть отсортирован. Без указания заказа база данных может свободно возвращать документы в любом порядке, и этот порядок может меняться от одного поиска к другому. Переупорядочение документов, через которые пользователь разбивает страницы на страницы, создает плохой пользовательский интерфейс.

у вас может быть два или более одинаковых значения для этого поля, следующих друг за другом в отсортированной коллекции. Если ваши страницы разбиты посередине, запрос на следующую страницу приведет к дублированию или игнорированию элементов.

База данных может возвращать документы, которые сравниваются одинаково в любом порядке, и этот порядок может изменяться междусмежные запросы. Вот почему при сортировке по полю с низким количеством элементов лучше добавить в выражение сортировки другое поле с большим количеством элементов, чтобы обеспечить возврат документов в стабильном порядке.

Но есть ли способ сделать пагинацию на основе курсора без сортировки коллекции по этому курсору?

Вы можете кодировать смещение в идентификаторе курсора и использовать пропуск / предел.

...