Paginasi di DynamoDB
DynamoDB tidak pernah mengembalikan "semua" hasil dalam satu panggilan. Sebuah
Query atau Scan mengembalikan paling banyak 1 MB data, lalu menyerahkan Anda
sebuah LastEvaluatedKey untuk melanjutkan. Melakukan paginasi dengan benar berarti
mengulang pada key itu — bukan pada penghitung.
Bagaimana paginasi bekerja di DynamoDB?
Sebuah Query atau Scan mengembalikan paling banyak 1 MB per panggilan, lalu menyerahkan kembali sebuah LastEvaluatedKey. Untuk berpindah halaman, Anda meneruskan key itu sebagai ExclusiveStartKey panggilan berikutnya dan mengulang hingga DynamoDB tidak mengembalikan key. Tidak ada nomor halaman, tidak ada jumlah total, dan Limit membatasi Item yang dievaluasi — bukan Item yang dikembalikan.
let key;
do {
const out = await client.send(new QueryCommand({...params, ExclusiveStartKey: key}));
process(out.Items);
key = out.LastEvaluatedKey;
} while (key);Ketika LastEvaluatedKey bernilai undefined, Anda sudah mencapai akhir. Teruskan
kembali sebagai ExclusiveStartKey untuk mengambil potongan berikutnya.
Alur kontrolnya adalah satu loop tunggal yang keluar hanya saat key tidak ada:
Setiap iterasi entah melanjutkan dari key yang dikembalikan atau berhenti — tidak ada penghitung.
Limit bukanlah ukuran halaman
Limit membatasi berapa banyak Item yang dievaluasi DynamoDB, bukan berapa
banyak yang dikembalikan setelah FilterExpression. Sebuah query Limit: 25 di
belakang filter bisa mengembalikan 3 Item dan tetap menyerahkan Anda sebuah
LastEvaluatedKey — Anda harus terus berpindah halaman sampai key kosong,
bahkan ketika sebuah halaman tampak pendek. LastEvaluatedKey yang tidak kosong
juga tidak pernah menjanjikan lebih banyak Item yang cocok; hanya key yang tidak
ada yang membuktikan Anda sudah mencapai akhir.
Biarkan SDK melakukan paginasi
Kedua SDK membungkus loop di atas sehingga Anda bisa 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 jumlah total dan tidak punya akses halaman acak — Anda
tidak bisa melompat ke "halaman 7" atau mundur tanpa memutar ulang cursor-nya.
Rancang UI seputar 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. Encode dengan base64 dan
serahkan ke klien sebagai nextToken yang buram; decode kembali menjadi
ExclusiveStartKey pada permintaan berikutnya. Tanpa state cursor di sisi server.
Token itu adalah DynamoDB-JSON — periksa dengan mata atau buat sendiri dengan konverter DynamoDB-JSON. Dan jika Anda berpindah halaman untuk menyiasati Scan, itu biasanya pertanda untuk menambahkan index saja.
Untuk melewatkan penulisan loop-nya sama sekali, query builder menyusun request Query/Scan lengkap dan mengeluarkan program SDK v3, CLI, atau boto3 yang bisa dijalankan — termasuk loop paginasinya.
Coba DynoTable untuk berpindah halaman melintasi hasil query secara visual, dengan cursor dilacak untuk Anda.