Paginación de los resultados de consulta de tabla en DynamoDB
DynamoDB pagina los resultados de las operaciones Query
. La paginación permite dividir los resultados de Query
en "páginas" de datos con un tamaño de 1 MB (o menos). Una aplicación puede procesar la primera página de resultados, luego la segunda página, y así sucesivamente.
Una operación Query
única devuelve solamente un conjunto de resultados que se ajuste al límite de tamaño de 1 MB. Para determinar si hay más resultados y para recuperarlos de página en página, las aplicaciones deben hacer lo siguiente:
-
Examinar el resultado de
Query
de bajo nivel:-
Si el resultado contiene una entrada
LastEvaluatedKey
, vaya al paso 2. -
Si no figura
LastEvaluatedKey
en el resultado, no hay más elementos que recuperar.
-
-
Crear una nueva solicitud
Query
con los mismos parámetros que la anterior. Sin embargo, esta vez, se toma el valorLastEvaluatedKey
del paso 1 y se usa como parámetroExclusiveStartKey
en la nueva solicitudQuery
. -
Ejecutar la nueva solicitud
Query
. -
Ir al paso 1.
Es decir, el valor de LastEvaluatedKey
de la respuesta de Query
debe utilizarse como valor de ExclusiveStartKey
en la siguiente solicitud Query
. Si no hay una entrada LastEvaluatedKey
en una respuesta de Query
, significa que se ha recuperado la última página de resultados. Si LastEvaluatedKey
no está vacía, no significa necesariamente que haya más datos en el conjunto de resultados. La única forma de saber que se ha alcanzado el final del conjunto de resultados es cuando LastEvaluatedKey
está vacío.
Puede utilizar la AWS CLI para ver este comportamiento. La AWS CLI envía solicitudes Query
de bajo nivel a DynamoDB una y otra vez hasta que LastEvaluatedKey
ya no esté presente en los resultados. Considere el siguiente ejemplo de la AWS CLI que recupera títulos de películas de un determinado año:
aws dynamodb query --table-name Movies \ --projection-expression "title" \ --key-condition-expression "#y = :yyyy" \ --expression-attribute-names '{"#y":"year"}' \ --expression-attribute-values '{":yyyy":{"N":"1993"}}' \ --page-size 5 \ --debug
Normalmente, la AWS CLI se encarga de la paginación automáticamente. No obstante, en este ejemplo, el parámetro --page-size
de la AWS CLI limita el número de elementos por página. El parámetro --debug
muestra información de bajo nivel de las solicitudes y las respuestas.
Si ejecuta el ejemplo, la primera respuesta de DynamoDB será similar a la siguiente.
2017-07-07 11:13:15,603 - MainThread - botocore.parsers - DEBUG - Response body: b'{"Count":5,"Items":[{"title":{"S":"A Bronx Tale"}}, {"title":{"S":"A Perfect World"}},{"title":{"S":"Addams Family Values"}}, {"title":{"S":"Alive"}},{"title":{"S":"Benny & Joon"}}], "LastEvaluatedKey":{"year":{"N":"1993"},"title":{"S":"Benny & Joon"}}, "ScannedCount":5}'
El elemento LastEvaluatedKey
de la respuesta indica que no se han recuperado todos los elementos. La AWS CLI envía entonces otra solicitud Query
a DynamoDB. Este patrón de solicitud y respuesta continúa hasta la respuesta final.
2017-07-07 11:13:16,291 - MainThread - botocore.parsers - DEBUG - Response body: b'{"Count":1,"Items":[{"title":{"S":"What\'s Eating Gilbert Grape"}}],"ScannedCount":1}'
La ausencia de LastEvaluatedKey
indica que no hay más elementos que recuperar.
nota
Los SDK de AWS se encargan también de las respuestas de DynamoDB de bajo nivel (incluida la presencia o ausencia de LastEvaluatedKey
) y proporcionan varias abstracciones para paginar los resultados de Query
. Por ejemplo, la interfaz de documentos de SDK para Java proporciona compatibilidad con java.util.Iterator
para que pueda examinar los resultados de uno en uno.
Para ver ejemplos de código en diversos lenguajes de programación, consulte la Guía de inicio de Amazon DynamoDB y la documentación del SDK de AWS correspondiente a su lenguaje.
También puede reducir el tamaño de página limitando el número de elementos del conjunto de resultados, con el parámetro de Limit
de la operación de Query
.
Para obtener más información sobre cómo realizar consultas en DynamoDB, consulte Consulta de tablas en DynamoDB.