sql >> Base de Datos >  >> NoSQL >> MongoDB

Lazy Loading/Más desplazamiento de datos en Mongoose/Nodejs

El concepto general de "paginación" es usar .skip() que esencialmente "salta" los resultados que ya se han recuperado, por lo que básicamente puede hacer esto:

var q = Post.find().sort( "rating" ).skip(10).limit(10);

Pero en realidad, como puede imaginar, esto se ralentizará considerablemente cuando ingrese algunas "páginas". Entonces, realmente quiere algo más inteligente. Esencialmente, esta es una "consulta de rango" en la que desea obtener resultados más altos (o más bajos si son descendentes) que el último conjunto de resultados recuperado. Entonces, dado el último valor de 5 entonces por más de lo que harías:

var q = Post.find({ "rating": { "$gt": 5 } }).sort( "rating" ).limit(10);

Se ve bien, pero realmente todavía hay un problema. ¿Qué pasa si la siguiente "página" también contiene resultados con una calificación de 5? Esta consulta los omitiría y nunca los mostraría.

Lo más inteligente es "conservar" todo el _id valores del documento ya que son claves únicas. Básicamente aplica el mismo tipo de cosas, excepto que esta vez te aseguras de no incluir los resultados de la página anterior en la nueva. El $nin el operador ayuda aquí:

var q = Post.find({ "rating": { "$gte": 5 }, "_id": { "$nin": seenIds } })
    .sort( "rating" ).limit(10);

Si los seenIds es solo la última página de resultados o algo más depende de la "densidad" del valor que está clasificando y, por supuesto, debe "mantenerlos" en una variable de sesión o algo así.

Pero intente adaptar esto, ya que las consultas de rango suelen ser su mejor resultado de rendimiento.