performance - comando - MongoDB paginación a distancia
pagination nodejs (2)
¡Buena pregunta!
"¿Cuántos son demasiadas?" - eso, por supuesto, depende de su tamaño de datos y los requisitos de rendimiento. Personalmente, me siento incómodo cuando omito más de 500-1000 registros.
La respuesta real depende de tus requisitos. Esto es lo que hacen los sitios modernos (o, al menos, algunos de ellos).
Primero, la barra de navegación se ve así:
1 2 3 ... 457
Obtienen el número de página final del recuento total de registros y el tamaño de página. Pasemos a la página 3. Eso implicará algunas omisiones del primer registro. Cuando llegan los resultados, usted conoce la identificación del primer registro en la página 3.
1 2 3 4 5 ... 457
Vamos a saltear un poco más y vamos a la página 5.
1 ... 3 4 5 6 7 ... 457
Entiendes la idea. En cada punto, verá las páginas primera, última y actual, y también dos páginas hacia adelante y hacia atrás desde la página actual.
Consultas
var current_id; // id of first record on current page.
// go to page current+N
db.collection.find({_id: {$gte: current_id}}).
skip(N * page_size).
limit(page_size).
sort({_id: 1});
// go to page current-N
// note that due to the nature of skipping back,
// this query will get you records in reverse order
// (last records on the page being first in the resultset)
// You should reverse them in the app.
db.collection.find({_id: {$lt: current_id}}).
skip((N-1)*page_size).
limit(page_size).
sort({_id: -1});
Se dice que el uso de skip () para la paginación en la colección MongoDB con muchos registros es lento y no se recomienda.
Se podría usar paginación a distancia (basada en> _id comparsion)
db.items.find({_id: {$gt: ObjectId(''4f4a3ba2751e88780b000000'')}});
Es bueno para mostrar prev. & next buttons - pero no es muy fácil de implementar cuando desea visualizar los números de página reales 1 ... 5 6 7 ... 124 - debe precalcular desde qué "_id" comienza cada página.
Entonces tengo dos preguntas:
1) ¿Cuándo debería preocuparme por eso? Cuando hay "demasiados registros" con una desaceleración notable para skip ()? 1 000? 1 000 000?
2) ¿Cuál es el mejor enfoque para mostrar enlaces con números de página reales cuando se usa paginación a distancia?
Es difícil dar una respuesta general porque depende mucho de qué consulta (o consultas) esté utilizando para construir el conjunto de resultados que se muestran. Si los resultados se pueden encontrar utilizando solo el índice y se presentan en orden de índice, db.dataset.find (). Limit (). Skip () puede funcionar bien incluso con una gran cantidad de omisiones. Este es probablemente el enfoque más fácil para codificar. Pero incluso en ese caso, si puede almacenar en caché números de página y vincularlos a valores de índice, puede hacerlo más rápido para la segunda y tercera persona que desee ver la página 71, por ejemplo.
En un conjunto de datos muy dinámico donde los documentos serán agregados y eliminados mientras otra persona busca datos, el almacenamiento en caché se desactualizará rápidamente y el método de límite y omisión puede ser el único confiable para dar buenos resultados.