Il concetto generale di "paging" consiste nell'usare .skip()
che essenzialmente "salta" i risultati che sono già stati recuperati, quindi puoi essenzialmente farlo:
var q = Post.find().sort( "rating" ).skip(10).limit(10);
Ma in realtà, come puoi immaginare, questo rallenterà considerevolmente quando inserirai alcune "pagine". Quindi vuoi davvero qualcosa di più intelligente. In sostanza si tratta di una "query di intervallo" in cui si desidera ottenere risultati superiori (o inferiori se discendenti) rispetto all'ultimo set di risultati recuperato. Quindi dato l'ultimo valore di 5
quindi per più di quanto faresti:
var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);
Sembra ok, ma in realtà c'è ancora un problema. E se anche la "pagina" successiva contenesse risultati con un punteggio di 5? Questa query salterebbe quelli e non li visualizzerebbe mai.
La cosa intelligente da fare è "conservare" tutto il _id
valori dal documento poiché sono chiavi univoche. Fondamentalmente applica lo stesso genere di cose, tranne che questa volta ti assicuri di non includere i risultati della pagina precedente in quella nuova. Il $nin
l'operatore aiuta qui:
var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
.sort( "rating" ).limit(10);
Se il seenIds
è solo l'ultima pagina dei risultati o qualcosa in più dipende dalla "densità" del valore su cui stai ordinando e ovviamente devi "contenerli" in una variabile di sessione o qualcosa del genere.
Ma prova ad adattarlo, poiché le query sull'intervallo di solito sono il miglior risultato in termini di prestazioni.