Ogólna koncepcja „stronicowania” polega na użyciu .skip()
który zasadniczo „przeskakuje” wyniki, które zostały już pobrane, więc możesz to zrobić:
var q = Post.find().sort( "rating" ).skip(10).limit(10);
Ale tak naprawdę, jak możesz sobie wyobrazić, to znacznie zwolni, gdy pojawi się kilka „stron”. Więc naprawdę chcesz czegoś mądrzejszego. Zasadniczo jest to „zapytanie zakresowe”, w którym chcesz uzyskać wyższe (lub niższe, jeśli malejące ) wyniki niż ostatni pobrany zestaw wyników. Więc biorąc pod uwagę ostatnią wartość 5
wtedy za większe niż byś zrobił:
var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);
Wygląda dobrze, ale tak naprawdę nadal jest problem. Co zrobić, jeśli następna „strona” również zawierała wyniki z oceną 5? To zapytanie pominie je i nigdy ich nie wyświetli.
Mądrą rzeczą do zrobienia jest "zachowanie" wszystkich _id
wartości z dokumentu, ponieważ są to unikalne klucze. Zasadniczo zastosuj to samo, ale tym razem upewnij się, że nie uwzględniasz wyników z poprzedniej strony w nowej. $nin
operator pomaga tutaj:
var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
.sort( "rating" ).limit(10);
Czy seenIds
to tylko ostatnia strona wyników lub więcej zależy od „gęstości” wartości, według której sortujesz, i oczywiście musisz „zachować” je w zmiennej sesji lub coś takiego.
Ale spróbuj to dostosować, ponieważ zapytania o zakres są zwykle najlepszym wynikiem.