Débutant5 min de lecture

Comment interroger DynamoDB en ordre décroissant

Par défaut, un Query DynamoDB renvoie les items en ordre croissant de clé de tri. Mais la plupart des patterns d'accès « donne-moi les derniers » veulent l'inverse — le plus récent d'abord. Le bouton, c'est un seul booléen sur le Query : ScanIndexForward. Mets-le à false et la même requête lit la partition à l'envers.

C'est un seul paramètre, mais il fait trébucher les gens parce qu'on le confond facilement avec un tri des résultats après coup (ce que DynamoDB ne fait pas) et parce que son nom se lit à rebours de ce qu'il contrôle.

Comment interroger DynamoDB en ordre décroissant ?

Définis ScanIndexForward=false sur le Query. Par défaut, DynamoDB renvoie les items en ordre croissant de clé de tri ; basculer ce seul booléen lit la partition à l'envers, te donnant les résultats du plus récent au plus ancien quand ta clé de tri est un horodatage ou une séquence. Cela ne change que l'ordre, pas quels items correspondent, et les lectures en sens inverse coûtent exactement la même chose que les lectures en sens direct.

  • ScanIndexForward=true (par défaut) → ordre croissant de clé de tri.
  • ScanIndexForward=false → ordre décroissant — le plus récent d'abord quand ta clé de tri est un horodatage ou une séquence.
  • Il n'affecte que l'ordre, pas quels items correspondent — c'est toujours la condition de clé qui décide.
  • C'est gratuit. L'ordre inverse coûte la même chose que l'ordre direct ; DynamoDB lit l'ordre stocké de la partition dans les deux cas.
  • Utilise Limit avec pour obtenir « les N plus récents » en une seule lecture pas chère.

Le problème : « montre-moi les derniers d'abord »

Disons que tu gères un classement multijoueur et que tu stockes les événements de score de chaque joueur sous une même clé de partition, triés par horodatage croissant :

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

Le tableau de bord a besoin des scores les plus récents. Un simple Query sur GAME#42 les renvoie du plus ancien au plus récent, alors tu serais tenté de tout lire et de l'inverser dans ton application — gaspilleur, et cassé dès que tu ajoutes Limit. DynamoDB peut te les renvoyer du plus récent au plus ancien directement.

Comment fonctionne ScanIndexForward

Les items d'une partition sont physiquement stockés triés par clé de tri. Un Query parcourt cet ordre ; ScanIndexForward choisit juste le sens du parcours :

  • true (par défaut) — démarre à la plus petite clé de tri, parcourt vers le haut (croissant).
  • false — démarre à la plus grande clé de tri, parcourt vers le bas (décroissant).

Élément crucial : c'est une propriété de la lecture, pas de la table — les mêmes items, la même condition de clé, juste inversés. Et comme DynamoDB ne fait que choisir un sens sur des données déjà triées, les lectures décroissantes sont exactement aussi peu chères que les croissantes. Combine-le avec Limit=10 et tu obtiens « les 10 événements de score les plus récents » en un seul Query au coût minimal.

true par défautfalseQuery GAME#42ScanIndexForward ?Score le plus ancien d'abordScore le plus récent d'abord

Une subtilité : en paginant en arrière à travers un jeu de résultats décroissant, le curseur LastEvaluatedKey/ExclusiveStartKey fonctionne toujours — garde simplement ScanIndexForward=false cohérent sur chaque page du même scan, sinon le sens du curseur et l'ordre se contredisent.

Construire la requête dans DynoTable

Pour assembler la condition de clé elle-même (et voir les maps correspondantes de noms/valeurs d'attributs), utilise le constructeur d'expressions DynamoDB.

Dans DynoTable, tu lis un onglet via une clé choisie et tu règles le sens de tri sur l'onglet avec un sélecteur — pas besoin d'écrire ScanIndexForward à la main. Bascule-le pour prévisualiser les résultats du plus récent au plus ancien.

Bascule d'un onglet de requête en ordre décroissant (le plus récent d'abord) dans DynoTable.
Bascule d'un onglet de requête en ordre décroissant (le plus récent d'abord) dans DynoTable.

Pièges et étapes suivantes

  • ScanIndexForward inverse, il ne trie pas par un attribut arbitraire. L'ordre est toujours par clé de tri — pour trier par autre chose, il faut cet attribut comme clé de tri (souvent via un GSI).
  • Ne fais pas tout-lire-puis-inverser dans ton application — règle le flag et ajoute Limit.
  • Garde le flag cohérent pendant la pagination d'un scan multi-pages, sinon le curseur se bat contre l'ordre.
  • Tu veux le plus récent en numérique ? Assure-toi que la clé de tri se trie correctement — complète les nombres avec des zéros pour que l'ordre lexicographique corresponde.
  • À voir aussi : stratégies de clé de tri et pagination.

Envie d'inverser l'ordre des résultats sans toucher aux paramètres de l'API ? Télécharge DynoTable et interroge tes tables directement.

Mis à jour