O conceito geral de "paginação" é usar
.skip()
que essencialmente "pula" os resultados que já foram recuperados, então você pode fazer basicamente isso:var q = Post.find().sort( "rating" ).skip(10).limit(10);
Mas realmente, como você pode imaginar, isso vai diminuir consideravelmente quando você colocar algumas "páginas". Então você realmente quer algo mais inteligente. Essencialmente, esta é uma "consulta de intervalo" na qual você deseja obter resultados mais altos (ou mais baixos, se descendente) do que o último conjunto de resultados recuperados. Então, dado o último valor de
5
então para maior do que você faria:var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);
Parece Ok, mas realmente ainda há um problema. E se a próxima "página" também contiver resultados com uma classificação de 5? Essa consulta pularia esses e nunca os exibiria.
A coisa mais inteligente a fazer é "manter" todos os
_id
valores do documento, pois são chaves exclusivas. Basicamente aplique o mesmo tipo de coisa, exceto que desta vez você se certifica de não incluir os resultados da página anterior em sua nova. O $nin
operador ajuda aqui:var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
.sort( "rating" ).limit(10);
Se os
seenIds
é apenas a última página de resultados ou um pouco mais depende da "densidade" do valor que você está classificando, e é claro que você precisa "manter" isso em uma variável de sessão ou algo assim. Mas tente adaptar isso, pois as consultas de intervalo geralmente são o melhor resultado de desempenho.