Pagination in DynamoDB
DynamoDB liefert nie „alle“ Ergebnisse in einem Aufruf. Ein Query oder Scan
liefert höchstens 1 MB Daten und reicht dir dann einen LastEvaluatedKey, um von dort
fortzusetzen. Pagination richtig zu machen heißt, über diesen Schlüssel zu schleifen —
nicht über einen Zähler.
Die Schleife
let key;
do {
const out = await client.send(new QueryCommand({...params, ExclusiveStartKey: key}));
process(out.Items);
key = out.LastEvaluatedKey;
} while (key);Wenn LastEvaluatedKey undefined ist, hast du das Ende erreicht. Gib ihn als
ExclusiveStartKey zurück, um die nächste Scheibe zu holen.
Der Kontrollfluss ist eine einzige Schleife, die nur bei einem fehlenden Schlüssel endet:
Jeder Durchlauf setzt entweder vom zurückgegebenen Schlüssel fort oder stoppt — es gibt keinen Zähler.
Limit ist keine Seitengröße
Limit begrenzt, wie viele Items DynamoDB auswertet, nicht wie viele es nach einer
FilterExpression zurückgibt. Eine Limit: 25-Abfrage hinter einem Filter kann 3
Items zurückgeben und dir trotzdem einen LastEvaluatedKey reichen — du musst weiter
paginieren, bis der Schlüssel leer ist, selbst wenn eine Seite kurz aussieht. Ein
nicht-leerer LastEvaluatedKey verspricht ebenfalls nie mehr passende Items;
nur ein fehlender Schlüssel beweist, dass du das Ende erreicht hast.
Das SDK paginieren lassen
Beide SDKs umschließen die obige Schleife, sodass du Seiten direkt durchlaufen kannst:
// AWS SDK for JavaScript v3
import {paginateQuery} from '@aws-sdk/lib-dynamodb';
for await (const page of paginateQuery({client}, params)) {
process(page.Items);
}# boto3
paginator = client.get_paginator('query')
for page in paginator.paginate(**params):
process(page['Items'])Keine Seitenzahlen
DynamoDB hat keine Gesamtanzahl und keinen wahlfreien Seitenzugriff — du kannst
nicht zu „Seite 7“ springen oder rückwärts blättern, ohne die Cursor erneut
durchzuspielen. Gestalte UIs um Infinite Scroll / „Mehr laden“ herum, nicht um
nummerierte Seiten. (Eine Select: 'COUNT'-Abfrage liest — und berechnet — trotzdem
jedes passende Item, um es zu zählen.)
Zustandslose Cursor für APIs
LastEvaluatedKey sind schlicht die Schlüsselattribute des letzten Items.
Base64-kodiere ihn und reiche ihn Clients als opaken nextToken; dekodiere ihn beim
nächsten Request zurück in ExclusiveStartKey. Kein serverseitiger Cursor-Zustand.
Dieser Token ist DynamoDB-JSON — sieh ihn dir an oder bastle ihn von Hand mit dem DynamoDB-JSON-Konverter. Und wenn du paginierst, um einen Scan zu umgehen, ist das meist ein Signal, stattdessen einen Index hinzuzufügen.
Probiere DynoTable, um visuell durch Abfrageergebnisse zu blättern, mit dem Cursor, der für dich nachgehalten wird.