Paginar os resultados de consultas à tabela no DynamoDB - Amazon DynamoDB

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:

  1. 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.

  2. Construa a nova solicitação de Query com os mesmos parâmetros da anterior. No entanto, desta vez, use o valor de LastEvaluatedKey da etapa 1 como o parâmetro ExclusiveStartKey na nova solicitação de Query.

  3. Execute a nova solicitação de Query.

  4. 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.