Obecným konceptem "stránkování" je použití .skip()
který v podstatě "přeskakuje" výsledky, které již byly načteny, takže můžete v podstatě udělat toto:
var q = Post.find().sort( "rating" ).skip(10).limit(10);
Ale opravdu, jak si dokážete představit, toto se značně zpomalí, když dostanete pár „stránek“. Takže opravdu chcete něco chytřejšího. V podstatě se jedná o "dotaz na rozsah", kde chcete získat vyšší (nebo nižší, pokud sestupně ) výsledky, než je poslední získaná sada výsledků. Takže vzhledem k poslední hodnotě 5
pak pro větší, než byste udělali:
var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);
Vypadá to dobře, ale pořád je tu problém. Co když další „stránka“ obsahuje také výsledky s hodnocením 5? Tento dotaz je přeskočí a nikdy je nezobrazí.
Chytrá věc, kterou musíte udělat, je „zachovat“ všechny _id
hodnoty z dokumentu, protože se jedná o jedinečné klíče. Aplikujte v podstatě totéž, ale tentokrát se ujistěte, že do nové stránky nezahrnujete výsledky z předchozí stránky. $nin
Zde pomůže operátor:
var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
.sort( "rating" ).limit(10);
Zda seenIds
je pouze poslední stránka výsledků nebo něco více závisí na "hustotě" hodnoty, podle které třídíte, a samozřejmě je musíte "uchovat" v proměnné relace nebo tak něco.
Ale zkuste to přizpůsobit, protože dotazy na rozsah jsou obvykle vaším nejlepším výsledkem.