2013-07-12 2 views
2

Я создаю приложение, которое вызывает данные от MongoDB. Для целей этого вопроса притворитесь, что пользователь выполняет поиск моего приложения для определенного запроса, а MongoDB имеет 4000 результатов, чтобы выплюнуть, которые соответствуют запросу.Paginating results in MongoDB, не полагаясь на .skip()

После прочтения вокруг немного, я вижу, что это можно постраничной используя .skip() метод, but MongoDB themselves suggest against using this как это требует curser чтобы перебрать все записи вплоть до того, что вы пропуск к, который становится все более и более дорогим тем выше в списке вы идете.

Я видел несколько руководств, которые полагаются на свойство _id, чтобы результаты были последовательными, но здесь это не применимо - моя база данных содержит десятки тысяч записей, каждый из которых имеет уникальный идентификатор, а 4000 результатов, которые применяются к запросу пользователя, определенно не будут последовательными.

Может ли кто-нибудь подумать о способе сделать это, или skip() здесь единственный вариант?

Другие соображения:

пагинацию будет работать на основе позиции на этой странице. Например, первый запрос должен выложить 20 записей в мое приложение. Когда пользователь прокручивается в нижней части страницы, я мог бы получить _id из 20-го элемента на странице и передать его моему запросу, найти его в списке из 4000 результатов, найти следующий результат и начать следующий набор 20 оттуда. Возможно ли это, возможно, это будет меньше интенсивность процессора, чем skip()?

ответ

3

Ваш трюк в «других соображениях» работает только в том случае, если вы добавили сортировку на _id, иначе вы не можете гарантировать заказ для последующих запросов. Если вы хотите сортировать в другом поле, вам нужно индексировать это поле. Я также предлагаю вам запрос для элементов, так что вам не нужно возвращаться и находить следующий после 20-го элемента (конечно, вы все же можете показывать только первые 20 элементов).

MongoDB ranged pagination имеет также хороший пример.