Общата концепция за "странициране" е да се използва .skip()
което по същество „прескача“ резултатите, които вече са били извлечени, така че по същество можете да направите това:
var q = Post.find().sort( "rating" ).skip(10).limit(10);
Но наистина, както можете да си представите, това ще се забави значително, когато получите няколко „страници“. Така че наистина искате нещо по-умно. По същество това е „заявка за диапазон“, при която искате да вземете по-високи (или по-ниски, ако са низходящи) резултати от последния набор от извлечени резултати. Дадена е последната стойност от 5
тогава за повече, отколкото бихте направили:
var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);
Изглежда добре, но наистина все още има проблем. Ами ако следващата "страница" също съдържа резултати с рейтинг 5? Тази заявка ще ги пропусне и никога няма да ги покаже.
Най-умното нещо, което трябва да направите, е да "запазите" целия _id
стойности от документа, тъй като те са уникални ключове. По принцип прилагайте същото нещо, само че този път се уверете, че не включвате резултатите от предишната страница в новата. $nin
операторът помага тук:
var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
.sort( "rating" ).limit(10);
Дали seenIds
е само последната страница с резултати или някои повече зависи от "плътността" на стойността, по която сортирате, и разбира се трябва да ги "съхраните" в променлива на сесията или нещо подобно.
Но опитайте да адаптирате това, тъй като заявките за обхват обикновено са най-добрият ви резултат за ефективност.