Iniciante8 min de leitura

Como consultar DynamoDB em ordem decrescente

Por padrão, um DynamoDB Query retorna itens em ordem de chave de classificação crescente. Mas a maioria Os padrões de acesso “dê-me o mais recente” querem o oposto – o mais recente primeiro. O botão é um único booleano na consulta: ScanIndexForward. Defina-o para false e o mesmo consulta lê a partição ao contrário.

É um parâmetro, mas confunde as pessoas porque é fácil confundir com classificação os resultados após o fato (o que DynamoDB não faz) e porque o nome diz para trás do que ele controla.

Como faço para consultar o DynamoDB em ordem decrescente?

Defina ScanIndexForward=false no Query. Por padrão, DynamoDB retorna itens em ordem crescente de chave de classificação; inverter esse booleano único lê a partição ao contrário, fornecendo resultados mais recentes quando sua chave de classificação é um carimbo de data/hora ou sequência. Ele apenas altera a ordem, não quais itens correspondem, e as leituras reversas custam exatamente o mesmo que as leituras diretas.

  • ScanIndexForward=true (padrão) → ordem crescente de chaves de classificação.
  • ScanIndexForward=false → ordem decrescente — o mais novo primeiro quando sua chave de classificação é um carimbo de data/hora ou sequência.
  • Isso afeta apenas o pedido, e não quais itens correspondem - a condição principal ainda decide isso.
  • É grátis. O pedido reverso custa o mesmo que o encaminhamento; DynamoDB lê o ordem armazenada da partição de qualquer maneira.
  • Use Limit com ele para obter "o N mais recente" em uma leitura barata.

O problema: "mostre-me o mais recente primeiro"

Digamos que você execute uma tabela de classificação multijogador e armazene os eventos de pontuação de cada jogador em um chave de partição, classificada por um carimbo de data/hora 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 retorna os mais antigos primeiro, então você ficaria tentado a ler tudo e reverter em seu aplicativo - desperdiçado e quebrado no momento em que você adiciona Limit. DynamoDB pode devolvê-los mais novo-primeiro diretamente.

Como funciona o ScanIndexForward

Os itens em uma partição são armazenados fisicamente ordenados por chave de classificação. Um Query anda essa ordem; O ScanIndexForward apenas escolhe a direção da caminhada:

  • true (padrão) — comece na chave de classificação mais baixa, suba (crescente).
  • false — comece na chave de classificação mais alta, desça (descendente).

Crucialmente, esta é uma propriedade de read, não da tabela - os mesmos itens, os mesmos condição chave, apenas invertida. E porque o DynamoDB está apenas escolhendo uma direção dados já classificados, leituras decrescentes são exatamente tão barato como ascendentes. Combine-o com Limit=10 e você obterá "as 10 pontuações mais recentes events" em uma única consulta de custo mínimo.

verdadeiro padrãofalsoConsulta JOGO#42ScanIndexForward?Pontuação mais antiga primeiroPontuação mais recente primeiro

Uma sutileza: ao paginar para trás através de um conjunto de resultados descendente, o O cursor LastEvaluatedKey/ExclusiveStartKey ainda funciona - apenas mantenha ScanIndexForward=false consistente em todas as páginas da mesma consulta ou no cursor a direção e a ordem discordam.

Construindo a consulta no DynoTable

Para montar a própria condição-chave (e ver os mapas de nome de atributo correspondente/value), use o construtor de expressão DynamoDB. Para o solicitação inteira - índice, Limit e ScanIndexForward incluídos - o query builder compõe a Consulta e emite um programa executável SDK v3, CLI ou boto3.

No DynoTable, você lê uma guia através de uma chave escolhida e define a direção de classificação na guia com um botão de alternância – não há necessidade de escrever ScanIndexForward à mão. Vire para visualizar resultados mais recentes.

Mudando uma guia de consulta para ordem decrescente (mais recente primeiro) em DynoTable.
Mudando uma guia de consulta para ordem decrescente (mais recente primeiro) em DynoTable.

Armadilhas + próximos passos

  • ScanIndexForward inverte, não classifica por um atributo arbitrário. A ordem é sempre pela chave de classificação — para classificar por outra coisa, você precisa desse atributo como um chave de classificação (geralmente por meio de um GSI).
  • Não leia tudo e depois reverta em seu aplicativo — defina o sinalizador e adicione Limit.
  • Mantenha o sinalizador consistente ao paginar uma consulta de várias páginas, ou o cursor luta contra o ordem.
  • Deseja numérico mais novo primeiro? Uma chave de classificação digitada em número já classifica numericamente. Somente se você incorporou números dentro de uma chave de classificação string, você precisa adicione-os com zero para que a ordem lexicográfica corresponda.
  • Relacionado: estratégias de chave de classificação e paginação.

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

Chaves de classificação compostas e numéricas

A ordem decrescente segue regras do tipo chave de classificação, não seu modelo mental de "mais recente":

Chave de classificação armazenada comoDescer dá a vocêEntendi
Sequência ISO-8601 UTC 2026-06-27T10:09:00ZCarimbo de data/hora mais recente primeiroA ordem lexicográfica corresponde à cronologia quando o fuso horário é fixo
String de época com preenchimento de zeros 00000000001009Sequência mais alta primeiroNúmeros não preenchidos são classificados incorretamente ("9" > "10") - consulte preenchimento de zero
Tipo de número NMaior valor numérico primeiroOrdem numérica natural, não string
Prefixo de status STATUS#open#...Lexicográfico reverso em SK completoNão é o mesmo que "aberto mais recentemente", a menos que esteja codificado no sufixo

Se "mais recente" significar algo diferente da chave de classificação — por exemplo, classificar por points dentro da mesma partição do jogo – você precisa dessa métrica na classificação key (ou em um GSI cuja chave de classificação é points), não uma classificação pós-consulta em código do aplicativo.

Limit com leituras descendentes

O Limit limita os itens avaliados, não os itens retornados após um filtro. Par ScanIndexForward=false com Limit=10 em uma chave de classificação ordenada por tempo para buscar o dez eventos mais recentes em uma partição lida.

Custo de exemplo: dez itens de 2 KB em um Query descendente tocam 20 KB → 3 RCU eventualmente consistente (arredondado para blocos de 4 KB). Lendo a partição inteira de 10.000 eventos para reverter no código do aplicativo atinge aproximadamente 20 MB → milhares de RCU para o mesmo widget de UI. Modele o tamanho da sua partição com o calculadora de tamanho do item antes de escolher Limit.

A paginação permanece direcional

Ao paginar com ExclusiveStartKey, mantenha ScanIndexForward idêntico em cada pedido. Inverter o sinalizador entre páginas inverte a semântica do cursor – você pode pular ou duplicar linhas.

Para APIs expondo "carregar mais", codifique em base64 o LastEvaluatedKey de forma opaca; os clientes não devem alterar os componentes da chave de classificação. Veja paginação para padrões de token.

Paridade PartiQL e SDK

PartiQL As consultas ExecuteStatement aceitam a mesma semântica de ordenação através parâmetros Query subjacentes quando o executor mapeia para uma leitura de condição-chave. O construtor de consultas emite SDK v3, CLI ou boto3 programas com ScanIndexForward conectados explicitamente – útil quando sua equipe mixa Consultas ad hoc PartiQL com código SDK de produção.

Padrões de acesso que usam ordem decrescente

  • Feeds de atividadesSK é um carimbo de data/hora ISO; descendente + Limit produz um janela recente.
  • Placares — tecla de classificação numérica score; melhores pontuações em superfícies descendentes quando a chave de partição abrange um jogo ou temporada.
  • Audit tail — chaves de classificação EVENT#<ts> somente anexadas; descendente mostra o mais novo eventos primeiro sem um GSI.

Quando a IU também precisa de histórico ascendente ("mostrar o mais antigo primeiro"), a mesma consulta com ScanIndexForward=true evita duplicação de dados ou manutenção de dois índices.

Experimente alternar para dados reaisConecte o DynoTable, abra uma guia de consulta em uma partição com uma chave de classificação ordenada por tempo,

vire ascendente/descending e assista à reordenação da grade sem editar API parâmetros. Compare a capacidade consumida no log de operação — encaminhamento e leituras reversas no mesmo Limit devem corresponder.

Atualizado