Einsteiger4 Min. Lesezeit

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:

presentabsentQuery / ScanProcess ItemsLastEvaluatedKey?Set ExclusiveStartKeyDone

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.

Aktualisiert