Principiante4 min de lectura

Paginación en DynamoDB

DynamoDB nunca devuelve «todos» los resultados en una sola llamada. Una Query o un Scan devuelve como máximo 1 MB de datos y luego te entrega un LastEvaluatedKey para reanudar. Paginar correctamente significa iterar sobre esa clave — no sobre un contador.

¿Cómo funciona la paginación en DynamoDB?

Una Query o un Scan devuelve como máximo 1 MB por llamada y luego te devuelve un LastEvaluatedKey. Para paginar, pasas esa clave como el ExclusiveStartKey de la siguiente llamada e iteras hasta que DynamoDB no devuelva ninguna clave. No hay números de página, no hay recuento total, y Limit limita los Items evaluados — no los Items devueltos.

let key;
do {
  const out = await client.send(new QueryCommand({...params, ExclusiveStartKey: key}));
  process(out.Items);
  key = out.LastEvaluatedKey;
} while (key);

Cuando LastEvaluatedKey es undefined, has llegado al final. Pásalo de vuelta como ExclusiveStartKey para obtener la siguiente porción.

El flujo de control es un único bucle que solo termina cuando falta la clave:

presenteausenteQuery / ScanProcesar Items¿LastEvaluatedKey?Fijar ExclusiveStartKeyListo

Cada pasada o bien reanuda desde la clave devuelta o bien se detiene — no hay contador.

Limit no es un tamaño de página

Limit limita cuántos Items evalúa DynamoDB, no cuántos devuelve después de una FilterExpression. Una consulta con Limit: 25 detrás de un filtro puede devolver 3 Items y aun así entregarte un LastEvaluatedKey — debes seguir paginando hasta que la clave esté vacía, incluso cuando una página parezca corta. Un LastEvaluatedKey no vacío tampoco promete nunca más Items coincidentes; solo una clave ausente demuestra que has llegado al final.

Deja que el SDK pagine

Ambos SDK envuelven el bucle de arriba para que puedas iterar las páginas directamente:

// 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'])

Sin números de página

DynamoDB no tiene recuento total ni acceso aleatorio a páginas — no puedes saltar a la «página 7» ni retroceder sin reproducir los cursores. Diseña las interfaces en torno al scroll infinito / «cargar más», no a páginas numeradas. (Una consulta con Select: 'COUNT' aun así lee — y factura — cada Item coincidente para contarlos.)

Cursores sin estado para APIs

LastEvaluatedKey no es más que los atributos de clave del último Item. Codifícalo en base64 y entrégaselo a los clientes como un nextToken opaco; decodifícalo de vuelta a ExclusiveStartKey en la siguiente solicitud. Sin estado de cursor en el servidor.

Ese token es DynamoDB-JSON — inspecciónalo o créalo a mano con el conversor de DynamoDB-JSON. Y si estás paginando para sortear un Scan, eso suele ser una señal para añadir un índice en su lugar.

Para saltarte escribir el bucle por completo, el generador de consultas compone la solicitud Query/Scan completa y emite un programa ejecutable para SDK v3, CLI o boto3 — bucle de paginación incluido.

Prueba DynoTable para paginar los resultados de una consulta visualmente, con el cursor gestionado por ti.

Actualizado