Einsteiger4 Min. Lesezeit

Paginierung in DynamoDB

DynamoDB gibt nie „alle“ Ergebnisse in einem Aufruf zurück. Ein Query oder Scan gibt höchstens 1 MB Daten zurück und reicht dir dann einen LastEvaluatedKey, um fortzusetzen. Paginierung richtig zu machen bedeutet, auf diesem Key zu schleifen — nicht auf einem Zähler.

Wie funktioniert Paginierung in DynamoDB?

Ein Query oder Scan gibt höchstens 1 MB pro Aufruf zurück und reicht dann einen LastEvaluatedKey zurück. Zum Blättern übergibst du diesen Key als ExclusiveStartKey des nächsten Aufrufs und schleifst, bis DynamoDB keinen Key mehr zurückgibt. Es gibt keine Seitennummern, keine Gesamtzahl, und Limit begrenzt die ausgewerteten Items — nicht die zurückgegebenen.

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. Übergib ihn als ExclusiveStartKey zurück, um den nächsten Ausschnitt zu holen.

Der Kontrollfluss ist eine einzelne Schleife, die nur bei einem fehlenden Key endet:

vorhandenfehltQuery / ScanItems verarbeitenLastEvaluatedKey?ExclusiveStartKey setzenFertig

Jeder Durchlauf setzt entweder vom zurückgegebenen Key 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 weiterblättern, bis der Key leer ist, selbst wenn eine Seite kurz aussieht. Ein nicht-leerer LastEvaluatedKey verspricht auch nie weitere passende Items; nur ein fehlender Key beweist, dass du das Ende erreicht hast.

Lass das SDK paginieren

Beide SDKs kapseln die obige Schleife, sodass du direkt über Seiten iterieren 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 Seitennummern

DynamoDB hat keine Gesamtzahl und keinen wahlfreien Seitenzugriff — du kannst nicht zu „Seite 7“ springen oder rückwärts blättern, ohne die Cursor erneut abzuspielen. Entwirf UIs rund um Infinite Scroll / „Mehr laden“, 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 ist einfach die Key-Attribute des letzten Items. Base64-kodiere ihn und reiche ihn Clients als undurchsichtiges nextToken; dekodiere ihn beim nächsten Request zurück in ExclusiveStartKey. Kein serverseitiger Cursor-Zustand.

Dieses Token ist DynamoDB-JSON — betrachte oder erstelle eines 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.

Um dir das Schreiben der Schleife ganz zu sparen, komponiert der Query Builder den vollständigen Query-/Scan-Request und gibt ein lauffähiges SDK-v3-, CLI- oder boto3-Programm aus — Paginierungsschleife inklusive.

Probiere DynoTable, um durch Abfrageergebnisse visuell zu blättern, mit dem für dich mitgeführten Cursor.

Aktualisiert