Подтвердить что ты не робот

Как сделать разбиение на страницы с использованием запросов диапазона в MongoDB?

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

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

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

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

Я запускаю этот запрос:

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

Обратите внимание, что есть 3 предмета "Куриная грудка 8 унций".

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

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

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

Но я не знаю. Он собирается к последней куриной грудке 8 унций и оттуда вместо этого.

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

4b9b3361

Ответ 1

Так как в коллекции я был пейджинг, у меня были дубликаты значений, мне пришлось создать составной индекс в 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):

Первая страница

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

Вторая страница

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.

Ответ 2

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

см. документацию 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>"); } );
}