[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:
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
- 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.
| 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
Vistas con función Reducir
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.
DE tutorial
WHERE edad > 30
LÍMITE 2
OFFSET 2
Si quieres saber más sobre N1QL:
Mucha información útil, ¡genial!
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?
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.
Hola, ¿cómo puedo obtener totalPage con paginación.