Как сделать нумерацию страниц, используя диапазон запросов в MongoDB? - PullRequest
19 голосов
/ 02 апреля 2011

Я, вероятно, что-то упускаю, так как я все еще изучаю все тонкости MongoDB, но мне нужна помощь с разбивкой по страницам коллекции.

У меня есть коллекция, в которой есть список имен.

Нижний раунд говядиныКуриная грудка 6 унцийКуриная грудка 8 унцийКуриная грудка 8 унцийКуриная грудка 8 унцийКуриная грудка СлучайнаяКуриные ножкиКуриная вырезкаКуриные бедрышкиКошерная соль

Я создал составной индекс для "ProductName, _id".

Я выполняю этот запрос:

db.ProductGuideItem.find( { ProductName: { $gt: "Chicken Breast 8oz" } } ).sort({ProductName:1,_id:1}).limit(3); 

Обратите внимание, что есть 3 элемента "Chicken Breast 8oz".

Если я выполню этот запрос, я получу ...Куриная грудка СлучайнаяКуриные ножкиКуриная вырезка

Если бы я занимался поиском и начинал сверху.Запрос пропустил бы другие 2 "Куриная грудка 8 унций".

Так что, если на каждой странице может быть только 3 элемента, и я хочу видеть страницу 2, тогда я должен увидеть ..Куриная грудка 8 унцийКуриная грудка 8 унцийКуриная грудка Рандом.

Но я нет.Это идет к последней куриной грудке 8 унций и начинается оттуда вместо этого.

Есть ли способ обойти это?И как мне это сделать, если список отсортирован в обратном порядке?

Ответы [ 2 ]

28 голосов
/ 03 апреля 2011

Так как коллекция, которую я пейджировал, имела повторяющиеся значения, мне пришлось создать составной индекс для ProductName и id.

Создать составной индекс

db.ProductGuideItem.ensureIndex({ ProductName:1, _id:1});

Это решило мою проблему.
Справка: https://groups.google.com/d/msg/mongodb-user/3EZZIRJzW_A/oYH79npKZHkJ

Предположим, у вас есть следующие значения:

{a:1, b:1}
{a:2, b:1}
{a:2, b:2}
{a:2, b:3}
{a:3, b:1}

Таким образом, вы делаете это для нумерации страниц на основе диапазона (размер страницы 2):

1-я страница

find().sort({a:1, b:1}).limit(2)
{a:1, b:1}
{a:2, b:1}

2-я страница

find().min({a:2, b:1}).sort({a:1, b:1}).skip(1).limit(2)

{a:2, b:2}
{a:2, b:3}

3-я страница

find().min({a:2, b:3}).sort({a:1, b:1}).skip(1).limit(2)
{a:3, b:1}

Вот документы за $ min / max: http://www.mongodb.org/display/DOCS/min+and+max+Query+Specifiers

Если в вашей коллекции нет повторяющихся значений, вам не нужно использовать min & max или создавать составной индекс. Вы можете просто использовать $ lt & $ gt.

11 голосов
/ 25 августа 2013

Вам просто нужно позвонить скипом на курсор

см. Документацию MongoDB по пропуск курсора «Этот подход может быть полезен для реализации« постраничных »результатов».

Этот пример взят из примера Mongodb

function printStudents(pageNumber, nPerPage) {
   print("Page: " + pageNumber);
   db.students.find().skip((pageNumber-1)*nPerPage).limit(nPerPage).forEach( function(student) { print(student.name + "<p>"); } );
}
...