Iniciante5 min de leitura

Como Consultar o DynamoDB em Ordem Decrescente

Por padrão, um Query do DynamoDB retorna itens em ordem crescente de chave de ordenação. Mas a maioria dos padrões de acesso do tipo "me dê os mais recentes" quer o oposto — os mais novos primeiro. O botão é um único booleano no Query: ScanIndexForward. Defina-o como false e a mesma consulta lê a partição ao contrário.

É um único parâmetro, mas confunde as pessoas porque é fácil de misturar com ordenar os resultados depois (o que o DynamoDB não faz) e porque o nome se lê ao contrário do que ele controla.

Como consultar o DynamoDB em ordem decrescente?

Defina ScanIndexForward=false no Query. Por padrão, o DynamoDB retorna itens em ordem crescente de chave de ordenação; inverter esse único booleano faz a consulta percorrer a partição ao contrário, retornando os resultados mais novos primeiro quando sua chave de ordenação é um timestamp ou sequência. Isso altera apenas a ordenação, não quais itens correspondem, e leituras inversas custam exatamente o mesmo que as diretas.

  • ScanIndexForward=true (padrão) → ordem crescente de chave de ordenação.
  • ScanIndexForward=false → ordem decrescente — os mais novos primeiro quando sua chave de ordenação é um timestamp ou uma sequência.
  • Afeta apenas a ordenação, não quais itens correspondem — quem decide isso ainda é a key condition.
  • É de graça. A ordem invertida custa o mesmo que a direta; o DynamoDB lê a ordem armazenada da partição de qualquer jeito.
  • Use Limit junto para obter "os N mais recentes" em uma única leitura barata.

O problema: "me mostre os mais recentes primeiro"

Digamos que você opere um placar multiplayer e armazene os eventos de pontuação de cada jogador sob uma única chave de partição, ordenados por um timestamp crescente:

PK: GAME#42   SK: SCORE#2026-06-27T10:00:00Z   points
PK: GAME#42   SK: SCORE#2026-06-27T10:05:00Z   points
PK: GAME#42   SK: SCORE#2026-06-27T10:09:00Z   points

O painel precisa das pontuações mais recentes. Um Query simples em GAME#42 as retorna das mais antigas primeiro, então você ficaria tentado a ler tudo e inverter no seu app — um desperdício, e quebrado no instante em que você adiciona Limit. O DynamoDB consegue devolvê-las já com as mais novas primeiro.

Como o ScanIndexForward funciona

Os itens de uma partição são armazenados fisicamente ordenados pela chave de ordenação. Um Query percorre essa ordem; o ScanIndexForward apenas escolhe a direção do percurso:

  • true (padrão) — começa na menor chave de ordenação e sobe (crescente).
  • false — começa na maior chave de ordenação e desce (decrescente).

Crucialmente, isso é uma propriedade da leitura, não da tabela — os mesmos itens, a mesma key condition, só que invertidos. E como o DynamoDB está apenas escolhendo uma direção sobre dados já ordenados, as leituras decrescentes são exatamente tão baratas quanto as crescentes. Combine com Limit=10 e você obtém "os 10 eventos de pontuação mais recentes" em uma única Query de custo mínimo.

true padrãofalseQuery GAME#42ScanIndexForward?Pontuação mais antiga primeiroPontuação mais nova primeiro

Uma sutileza: ao paginar para trás num conjunto de resultados decrescente, o cursor LastEvaluatedKey/ExclusiveStartKey ainda funciona — apenas mantenha ScanIndexForward=false consistente em cada página da mesma varredura, ou a direção do cursor e a ordem vão discordar.

Montando a consulta no DynoTable

Para montar a própria key condition (e ver os mapas de nomes/valores de atributos correspondentes), use o construtor de expressões do DynamoDB.

No DynoTable, você lê uma aba por uma chave escolhida e define a direção da ordenação na aba com um controle — sem precisar escrever ScanIndexForward à mão. Inverta-o para pré-visualizar os resultados com os mais novos primeiro.

Alternando uma aba de consulta para a ordem decrescente (os mais novos primeiro) no DynoTable.
Alternando uma aba de consulta para a ordem decrescente (os mais novos primeiro) no DynoTable.

Armadilhas e próximos passos

  • ScanIndexForward inverte, não ordena por um atributo arbitrário. A ordem é sempre pela chave de ordenação — para ordenar por outra coisa, você precisa daquele atributo como chave de ordenação (muitas vezes via um GSI).
  • Não leia-tudo-e-inverta no seu app — defina a flag e adicione Limit.
  • Mantenha a flag consistente ao paginar uma varredura de várias páginas, ou o cursor briga com a ordem.
  • Quer os mais novos primeiro de forma numérica? Garanta que a chave de ordenação ordena corretamente — preencha os números com zeros à esquerda para que a ordem lexicográfica corresponda.
  • Relacionado: estratégias de chave de ordenação e paginação.

Quer inverter a ordem dos resultados sem mexer nos parâmetros da API? Baixe o DynoTable e consulte suas tabelas diretamente.

Atualizado