Het algemene concept van "paging" is om .skip()
. te gebruiken die in wezen de resultaten "overslaat" die al zijn opgehaald, dus u kunt in wezen dit doen:
var q = Post.find().sort( "rating" ).skip(10).limit(10);
Maar echt, zoals je je kunt voorstellen, gaat dit aanzienlijk langzamer als je een paar "pagina's" binnen krijgt. Dus je wilt echt iets slimmers. In wezen is dit een "bereikquery" waarbij u hogere (of lagere indien aflopende) resultaten wilt pakken dan de laatst opgehaalde reeks resultaten. Dus gezien de laatste waarde van 5
dan voor meer dan je zou doen:
var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);
Ziet er goed uit, maar er is nog steeds een probleem. Wat als de volgende "pagina" ook resultaten bevat met een beoordeling van 5? Deze zoekopdracht zou die overslaan en ze nooit weergeven.
Het slimme is om alle _id
. te "bewaren" waarden uit het document omdat het unieke sleutels zijn. Pas in principe hetzelfde soort dingen toe, behalve dat u er deze keer voor zorgt dat u de resultaten van de vorige pagina niet opneemt in uw nieuwe. De $nin
operator helpt hier:
var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
.sort( "rating" ).limit(10);
Of de seenIds
is slechts de laatste pagina met resultaten of iets meer, hangt af van de "dichtheid" van de waarde waarop u sorteert, en u moet deze natuurlijk "bewaren" in een sessievariabele of zoiets.
Maar probeer dit aan te passen, aangezien bereikquery's meestal uw beste prestatieresultaat zijn.