Paginar os resultados de consultas à tabela no DynamoDB
O DynamoDB pagina os resultados das operações Query
. Com a paginação, os resultados de Query
são divididos em "páginas" de dados com 1 MB de tamanho (ou menos). Uma aplicação pode processar a primeira página de resultados e, em seguida, a segunda página, e assim por diante.
Uma única operação Query
retorna apenas um conjunto de resultados que estão dentro do limite de tamanho de 1 MB. Para determinar se há mais resultados e para recuperá-los em uma página por vez, os aplicativos devem fazer o seguinte:
-
Examine o resultado de
Query
de baixo nível:-
Se o resultado contiver um elemento
LastEvaluatedKey
e ele não for nulo, prossiga para a etapa 2. -
Se não houver um
LastEvaluatedKey
no resultado, não haverá mais itens a serem recuperados.
-
-
Construa a nova solicitação de
Query
com os mesmos parâmetros da anterior. No entanto, desta vez, use o valor deLastEvaluatedKey
da etapa 1 como o parâmetroExclusiveStartKey
na nova solicitação deQuery
. -
Execute a nova solicitação de
Query
. -
Vá para a etapa 1.
Em outras palavras, o valor LastEvaluatedKey
de uma resposta de Query
deve ser usado como ExclusiveStartKey
da próxima solicitação de Query
. Se não houver um elemento LastEvaluatedKey
em uma resposta de Query
, então, você recuperou a página de resultados final. Se LastEvaluatedKey
não está vazio, isso não necessariamente significa que há mais dados no conjunto de resultados. A única maneira de saber quando você atingiu o final do conjunto de resultados é quando LastEvaluatedKey
estiver vazio.
Você pode usar a AWS CLI para visualizar esse comportamento. A AWS CLI envia repetidamente solicitações Query
de baixo nível ao DynamoDB até que LastEvaluatedKey
não esteja mais presente nos resultados. Considere o seguinte exemplo da AWS CLI que recupera títulos de filmes de um determinado ano.
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, a AWS CLI lida com a paginação automaticamente. No entanto, neste exemplo, o parâmetro --page-size
da AWS CLI limita o número de itens por página. O parâmetro de --debug
imprime as informações de baixo nível sobre solicitações e respostas.
Se você executar o exemplo, a primeira resposta do DynamoDB será semelhante a esta.
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}'
O LastEvaluatedKey
na resposta indica que nem todos os itens foram recuperados. A AWS CLI emite outra solicitação de Query
para o DynamoDB. Essa solicitação e o padrão de resposta continuam, até a resposta 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}'
A ausência de LastEvaluatedKey
indica que não há mais itens a serem recuperados.
nota
Os AWS SDKs lidam com as respostas de baixo nível do DynamoDB (incluindo a presença ou a ausência de LastEvaluatedKey
) e fornecem várias abstrações para paginar os resultados de Query
Por exemplo, a interface do documento SDK para Java fornece o suporte a java.util.Iterator
para que você possa abordar um resultado de cada vez.
Para obter exemplos de código em várias linguagens de programação, consulte o Guia de conceitos básicos do Amazon DynamoDB e a documentação do AWS SDK para sua linguagem.
Você também pode reduzir o tamanho da página limitando o número de itens no conjunto de resultados, com o parâmetro Limit
da operação Query
.
Para obter mais informações sobre como realizar consultas com o DynamoDB, veja Consultar tabelas no DynamoDB.