Principiante8 min di lettura

Come Query DynamoDB in ordine decrescente

Per impostazione predefinita, DynamoDB Query restituisce gli elementi in ordine di chiave di ordinamento ascendente. Ma la maggior parte I modelli di accesso "dammi l'ultimo" vogliono il contrario: prima il più recente. La manopola è a booleano singolo sull'Query: ScanIndexForward. Impostalo su false e lo stesso la query legge la partizione al contrario.

È un parametro, ma fa inciampare le persone perché è facile confonderlo con l'ordinamento i risultati dopo il fatto (cosa che DynamoDB non fa) e perché il nome recita all'indietro rispetto a ciò che controlla.

Come posso interrogare DynamoDB in ordine decrescente?

Impostare ScanIndexForward=false sull'Query. Per impostazione predefinita, DynamoDB restituisce gli elementi in ordine crescente di chiave di ordinamento; lanciando questo singolo booleano si legge la partizione al contrario, fornendo i risultati più recenti quando la chiave di ordinamento è un timestamp o una sequenza. Cambia solo l'ordine, non quali elementi corrispondono, e le letture inverse costano esattamente come quelle in avanti.

  • ScanIndexForward=true (predefinito) → ordine crescente della chiave di ordinamento.
  • ScanIndexForward=false → ordine discendente: prima il più recente quando la chiave di ordinamento è un timestamp o una sequenza.
  • Influisce solo sull'ordine, non su quali articoli corrispondono: è ancora la condizione chiave lo decide.
  • È gratis. L'ordine inverso costa come quello in avanti; DynamoDB legge il in ogni caso l'ordine memorizzato della partizione.
  • Usa Limit con esso per ottenere "l'N più recente" in una lettura economica.

Il problema: "mostrami prima l'ultima versione"

Supponiamo che tu gestisca una classifica multiplayer e memorizzi gli eventi di punteggio di ciascun giocatore sotto uno chiave di partizione, ordinata in base a un 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

La dashboard necessita dei punteggi più recenti. Ritorna un semplice Query su GAME#42 prima quelli più vecchi, quindi saresti tentato di leggere tutto e invertirlo nella tua app — dispendioso e rotto nel momento in cui aggiungi Limit. DynamoDB può restituirli direttamente il più nuovo.

Come funziona ScanIndexForward

Gli Item in una partizione vengono archiviati fisicamente ordinati per chiave di ordinamento. Un Query cammina quell'ordine; ScanIndexForward sceglie semplicemente la direzione della camminata:

  • true (predefinito): inizia dalla chiave di ordinamento più bassa, sali (ascendente).
  • false: inizia dalla chiave di ordinamento più alta, prosegui verso il basso (discendente).

Fondamentalmente, questa è una proprietà della lettura, non della tabella: gli stessi elementi, gli stessi condizione chiave, appena invertita. E poiché DynamoDB sta solo scegliendo una direzione dati già ordinati, le letture discendenti lo sono esattamente altrettanto economico come ascendenti. Abbinalo a Limit=10 e otterrai "i 10 punteggi più recenti eventi" in un unico Query dal costo minimo.

true defaultfalseQuery GAME#42ScanIndexForward?Punteggio più vecchio primaPunteggio più nuovo prima

Una sottigliezza: quando si sfoglia all'indietro attraverso un set di risultati discendente, il file Il cursore LastEvaluatedKey/ExclusiveStartKey funziona ancora: basta mantenerlo ScanIndexForward=false coerente in ogni pagina della stessa query o nel cursore la direzione e l'ordine non sono d'accordo.

Creazione della query in DynoTable

Per assemblare la condizione chiave stessa (e vedere le mappe nome-attributo corrispondenti/value), utilizzare il creatore di espressioni DynamoDB. Per il intera richiesta - indice, Limit e ScanIndexForward inclusi - il costruttore di query compone l'Query ed emette a programma SDK v3, CLI o boto3 eseguibile.

In DynoTable, leggi una scheda tramite un tasto scelto e imposti la direzione di ordinamento sulla scheda con un interruttore: non è necessario scrivere a mano ScanIndexForward. Giralo per visualizzare l'anteprima risultati più recenti.

Passaggio di una scheda di query all'ordine discendente (dal più recente al primo) in DynoTable.
Passaggio di una scheda di query all'ordine discendente (dal più recente al primo) in DynoTable.

Insidie + passaggi successivi

  • ScanIndexForward inverte, non ordina in base a un attributo arbitrario. L'ordine è sempre tramite la chiave di ordinamento — per ordinare in base a qualcos'altro è necessario l'attributo as a chiave di ordinamento (spesso tramite un GSI).
  • Non leggere tutto e poi invertire nella tua app: imposta il flag e aggiungi Limit.
  • Mantieni coerente il flag durante il paging di una query multipagina oppure il cursore combatte il file ordine.
  • Vuoi numerico prima i più nuovi? Una chiave di ordinamento digitata con un numero ordina già numericamente. Solo se hai incorporato dei numeri all'interno di una chiave di ordinamento string, ne hai bisogno azzerali in modo che l'ordine lessicografico corrisponda.
  • Correlati: strategie di ordinamento e impaginazione.

Vuoi invertire l'ordine dei risultati senza toccare i parametri API? Scarica DynoTable ed interroga direttamente le tue tabelle.

Tasti di ordinamento compositi e numerici

L'ordine discendente segue le regole del tipo di chiave di ordinamento, non il tuo modello mentale "più recente":

sort key memorizzato comeDiscendente ti dàCapito
Stringa ISO-8601 UTC 2026-06-27T10:09:00ZPrima il timestamp più recenteL'ordine lessicografico corrisponde a quello cronologico quando viene fissato il fuso orario
Corda epoca con imbottitura zero 00000000001009Prima la sequenza più altaI numeri non riempiti vengono ordinati in modo errato ("9" > "10") — vedere zero-padding
Tipo di numero NPrima il valore numerico più grandeOrdine numerico naturale, non stringa
Prefisso di stato STATUS#open#...Lessicografico inverso su SK completoNon è uguale a "aperto più di recente" a meno che non sia codificato nel suffisso

Se "più recente" significa qualcosa di diverso dalla chiave di ordinamento, ad esempio ordinamento per points all'interno della stessa partizione di gioco: hai bisogno di quella metrica nell'ordinamento key (o su un GSI la cui chiave di ordinamento è points), non un ordinamento post-query in codice dell'applicazione.

Limit con letture discendenti

Limit limita gli articoli valutati, non gli articoli restituiti dopo un filtro. Coppia ScanIndexForward=false con Limit=10 su una chiave di ordinamento in ordine temporale per recuperare il file dieci eventi più recenti in una partizione letta.

Costo di esempio: dieci elementi da 2 KB in uno discendente Query toccano 20 KB → 3 RCU eventualmente coerente (arrotondato a blocchi da 4 KB). Lettura dell'intera partizione di 10.000 eventi da invertire nel codice dell'applicazione tocca ~20 MB → migliaia di RCU per lo stesso widget dell'interfaccia utente. Modella la dimensione della tua partizione con calcolatore della dimensione dell'articolo prima di scegliere Limit.

L'impaginazione rimane direzionale

Quando esegui la paginazione con ExclusiveStartKey, mantieni ScanIndexForward identico ogni richiesta. Capovolgendo la bandiera tra le pagine si inverte la semantica del cursore: puoi saltare o duplicare le righe.

Per gli API che espongono "carica di più", codificare in base64 l'LastEvaluatedKey in modo opaco; i client non devono modificare i componenti della chiave di ordinamento. Vedi impaginazione per modelli di token.

Parità PartiQL e SDK

Le query PartiQL ExecuteStatement accettano la stessa semantica di ordinamento parametri Query sottostanti quando l'esecutore si associa a una lettura di condizioni chiave. Il generatore di query emette SDK v3, CLI o boto3 programmi con ScanIndexForward cablato esplicitamente: utili quando il tuo team si mescola Query ad hoc PartiQL con codice SDK di produzione.

Accedi ai modelli che utilizzano l'ordine discendente

  • Feed attività: SK è un timestamp ISO; discendente + Limit produce a finestra recente.
  • Classifiche: chiave di ordinamento numerico score; superfici discendenti punteggi migliori quando la chiave di partizione riguarda un gioco o una stagione.
  • Coda di controllo: chiavi di ordinamento EVENT#<ts> di sola aggiunta; discendente mostra il più recente prima gli eventi senza GSI.

Quando l'interfaccia utente necessita anche di una cronologia crescente ("mostra prima il più vecchio"), la stessa query con ScanIndexForward=true evita la duplicazione dei dati o il mantenimento di due indici.

Prova a attivare/disattivare i dati reali

Connetti DynoTable, apri una scheda di query su una partizione con una chiave di ordinamento ordinata nel tempo, capovolgi ascendente/descending e osserva il riordino della griglia senza modificare API parametri. Confronta la capacità consumata nel registro delle operazioni: avanti e le letture inverse sullo stesso Limit dovrebbero corrispondere.

Aggiornato