Consulta SQL++ / N1QL

Mejores prácticas de paginación con Couchbase

[This blog was syndicated from https://blog.grallandco.com]

Si tienes que tratar con un gran número de documentos al hacer consultas contra un cluster de Couchbase es importante usar la paginación para obtener filas por página. Puedes encontrar algo de información en la documentación en el capítulo "Paginación", pero quiero entrar en más detalles y código de ejemplo en este artículo.
Para este ejemplo de paginación empezaré por crear una vista sencilla basada en el archivo muestra de cerveza la vista se utiliza para buscar cervecerías por países:

function (doc, meta) {
if (doc.type == "brewery" && doc.country){
emit(doc.country);
}
}

 

Esta vista lista todas las cervecerías por país, el índice tiene el siguiente aspecto:

Doc id Clave Valor
bersaglier Argentina null
cervecera_jerome Argentina null
brouwerij_nacional_balashi Aruba null
australian_brewing_corporation Australia null
carlton_y_united_breweries Australia null
cervecería_coopers Australia null
foster_s_australia_ltd Australia null
gold_coast_brewery Australia null
lion_nathan_australia_hunter_street Australia null
cervecería_pequeñas_criaturas Australia null
malt_shovel_brewery Australia null
matilda_bay_brewing Australia null
yellowstone_valley_brewing Estados Unidos null
yuengling_son_brewing Estados Unidos null
zea_rotisserie_y_cervecería Estados Unidos null
fosters_tien_gang Vietnam null
hue_brewery Vietnam null

Así que ahora quieres navegar en este índice con un tamaño de página de 5 filas.

Utilización de los parámetros skip / limit

Lo más sencillo es utilizar límite y omitir parámetros, por ejemplo:

Página 1 :  ?limit=5&skip0
Página 2:   ?limit=5&skip=5

Página x:   ?limit=5&skip(limit*(page-1))

Obviamente, puede utilizar cualquier otro parámetro que necesite para realizar consultas de rango o clave (startkey/endkey, tecla, teclas) y la opción de ordenación (descendente).

Esto es sencillo pero no es lo más eficiente, ya que el motor de consulta tiene que leer todas las filas que coinciden con la consulta, hasta que se alcanza el valor de omisión.

Algún ejemplo de código en python que pagine usando esta vista :

Esta aplicación realiza un bucle en todas las páginas hasta el final del índice.

Como he dicho antes, esto no representa las mejores prácticas de paginación, ya que el sistema debe leer todos los valores hasta llegar al salto. El siguiente ejemplo muestra una mejor manera de lidiar con esto.

Utilización de los parámetros startkey / startkey_docid

Para que esta paginación sea más eficaz, es posible adoptar otro enfoque. Este enfoque utiliza la función tecla de inicio y startkey_docid  para seleccionar los documentos adecuados.
  • En tecla de inicio será el valor de la clave donde la consulta debe empezar a leer (basado en la última clave de la "página anterior").
  • Dado que para una clave por ejemplo "Alemania" puede tener uno o más ids (documentos) es necesario decirle al motor de consultas de Couchbase por dónde empezar, para ello es necesario utilizar el comando startkey_docid e ignorar este id ya que es el último de la página anterior.
Así que si nos fijamos en el índice, y añadir un número de fila para explicar la paginación
Número de fila Doc id Clave Valor
Consulta de la página 1 : ?limit=5
1 bersaglier Argentina null
2 cervecera_jerome Argentina null
3 brouwerij_nacional_balashi Aruba null
4 australian_brewing_corporation Australia null
5 carlton_y_united_breweries Australia null
Consulta de la página 2: ?limit=5&startkey="Australia"&startkey_docid=carlton_and_united_breweries&skip=1
6 cervecería_coopers Australia null
7 foster_s_australia_ltd Australia null
8 gold_coast_brewery Australia null
9 lion_nathan_australia_hunter_street Australia null
10 cervecería_pequeñas_criaturas Australia null
Consulta de la página 3 : limit=5&startkey="Australia"&startkey_docid=little_creatures_brewery&skip=1
11 malt_shovel_brewery Australia null
12 matilda_bay_brewing Australia null
yellowstone_valley_brewing Estados Unidos null
yuengling_son_brewing Estados Unidos null
zea_rotisserie_y_cervecería Estados Unidos null
fosters_tien_gang Vietnam null
hue_brewery Vietnam null

Así, como se puede ver en los ejemplos anteriores, la consulta utiliza la startkey, un id de documento, y sólo lo pasa utilizando skip=1.

Veamos ahora el código de la aplicación, de nuevo en Python

 

Esta aplicación realiza un bucle en todas las páginas hasta el final del índice
Con este enfoque, la aplicación empieza a leer el índice en una clave específica (tecla de inicio ), y sólo se repite el bucle en la entrada necesaria del índice. Esto es más eficiente que utilizar el enfoque de salto simple.

 

Vistas con función Reducir

Cuando su vista está utilizando una función de reducción, si desea paginar sólo en las distintas teclas (con la función de reducción), necesita utilizar el omitir y límite parámetros.
Cuando utilice el  paramater startkey_docid con una función reduce calculará la reducción sólo para el subconjunto de ids de documentos que forman parte de tu consulta.

Paginador Java SDK de Couchbase

En los ejemplos anteriores, he mostrado cómo realizar la paginación utilizando los distintos parámetros de consulta. El SDK de Java proporciona un objeto Paginator para ayudar a los desarrolladores a manejar la paginación. El siguiente ejemplo utiliza la misma vista con la API Paginator.

Como puede ver, puede paginar fácilmente los resultados de una consulta utilizando el Paginador Java.

  • En la línea #37, se crea el Paginador a partir de los objetos vista y consulta y se especifica un tamaño de página
  • A continuación, sólo tiene que utilizar los métodos hasNext() y next() para navegar en los resultados.

El Paginador Java es consciente del hecho de que la consulta está utilizando una reducción o no, por lo que se puede utilizar con todo tipo de consultas - Internamente va a cambiar entre el enfoque de salto / límite y los enfoques doc_id. Se puede ver cómo se hace en la clase Paginator.

Tenga en cuenta que si quiere hacer eso en una aplicación Web entre peticiones HTTP debe mantener el objeto Paginator en la sesión del usuario ya que la API actual mantiene la página actual en su estado.

Conclusión

En esta entrada del blog has aprendido a manejar la paginación en las vistas de Couchbase; en resumen

  • La paginación se basa en algunos parámetros específicos que se envían al ejecutar una consulta.
  • Los desarrolladores Java pueden utilizar la clase Paginator que simplifica la paginación.
Te invito a echar un vistazo al nuevo Couchbase Query Language N1QL, aún en desarrollo, que proporcionará más opciones de paginación a los desarrolladores, utilizando parámetros LIMIT & OFFSET, por ejemplo:
SELECT fname, edad
DE tutorial
WHERE edad > 30
LÍMITE 2
OFFSET 2
PD: Editado el 8 de octubre para aclarar la función de paginación con reducción.
Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Author

Posted by Jennifer Garcia

Jennifer Garcia es Gerente Senior de Web en Couchbase Inc. Como responsable del sitio web, Jennifer tiene la responsabilidad general de las propiedades del sitio web, incluido el diseño, la implementación, el contenido y el rendimiento.

4 Comentarios

  1. devtools.korzh octubre 6, 2013 a 8:26 pm

    Mucha información útil, ¡genial!

  2. Una cosa que he notado sobre las páginas (y que menciona tu artículo) es que el tiempo para recuperar la página X es proporcional a la distancia que hay entre X y 0. Por ejemplo, si tengo 100.000 filas, y mis páginas son 1.000 cada una (lo que me da 100 páginas), y recupero la página 100, me llevará el mismo tiempo que recuperar las 100.000 enteras. Usted ha señalado una solución relativamente elaborada para la simplicidad de la tarea; ¿quizá esta funcionalidad pueda incorporarse por defecto a la lógica de visualización de la página?

  3. Si las claves de viewQuery(=startKey) son UNIQUE entre sí, creo que no es necesario utilizar startkey_docid. ¿Estoy en lo cierto?
    Y más... startkey_docid es independiente de la clave de consulta de la vista, por lo que parece que puede costar algo averiguar el punto de inicio por start_key_docid, desde el índice ordenado de la vista quiery - debe escanear desde el punto de inicio hasta encontrar docid.

  4. Hola, ¿cómo puedo obtener totalPage con paginación.

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.