Paginasi di DynamoDB
DynamoDB tidak pernah mengembalikan "semua" hasil dalam satu panggilan. Sebuah
Query atau Scan mengembalikan paling banyak 1 MB data, lalu memberi Anda
LastEvaluatedKey untuk melanjutkan. Membuat paginasi dengan benar berarti
melakukan loop pada key itu — bukan pada penghitung.
Loop-nya
let key;
do {
const out = await client.send(new QueryCommand({...params, ExclusiveStartKey: key}));
process(out.Items);
key = out.LastEvaluatedKey;
} while (key);Saat LastEvaluatedKey bernilai undefined, Anda telah mencapai akhir.
Berikan kembali sebagai ExclusiveStartKey untuk mengambil potongan berikutnya.
Alur kontrolnya adalah satu loop tunggal yang keluar hanya saat key tidak ada:
Setiap lintasan entah melanjutkan dari key yang dikembalikan atau berhenti — tidak ada penghitung.
Limit bukan ukuran halaman
Limit membatasi berapa banyak Item yang dievaluasi DynamoDB, bukan berapa
yang dikembalikannya setelah FilterExpression. Sebuah query Limit: 25 di
belakang sebuah filter dapat mengembalikan 3 Item dan tetap memberi Anda
LastEvaluatedKey — Anda harus terus mem-paging sampai key kosong, bahkan saat
sebuah halaman terlihat pendek. LastEvaluatedKey yang tidak kosong juga tidak
pernah menjanjikan lebih banyak Item yang cocok; hanya key yang tidak ada
yang membuktikan Anda telah mencapai akhir.
Biarkan SDK mem-paginasi
Kedua SDK membungkus loop di atas sehingga Anda dapat mengiterasi halaman langsung:
// 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'])Tanpa nomor halaman
DynamoDB tidak punya total hitungan dan tidak punya akses halaman acak — Anda
tidak bisa melompat ke "halaman 7" atau mundur tanpa memutar ulang cursor. Rancang
UI di sekitar infinite scroll / "muat lebih banyak", bukan halaman bernomor.
(Sebuah query Select: 'COUNT' tetap membaca — dan menagih — setiap Item yang
cocok untuk menghitungnya.)
Cursor stateless untuk API
LastEvaluatedKey hanyalah atribut key dari Item terakhir. Kodekan dengan base64
dan berikan ke klien sebagai nextToken yang opak; dekode kembali menjadi
ExclusiveStartKey pada request berikutnya. Tanpa state cursor di sisi server.
Token itu adalah DynamoDB-JSON — periksa atau buat satu secara manual dengan konverter DynamoDB-JSON. Dan jika Anda mem-paging untuk menyiasati sebuah Scan, itu biasanya adalah sinyal untuk menambahkan index sebagai gantinya.
Coba DynoTable untuk mem-paging hasil query secara visual, dengan cursor yang dilacak untuk Anda.