Pemula3 menit baca

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:

presentabsentQuery / ScanProcess ItemsLastEvaluatedKey?Set ExclusiveStartKeyDone

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.

Diperbarui