Pemula4 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 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:

adatidak adaQuery / ScanProses ItemsLastEvaluatedKey?Set ExclusiveStartKeySelesai

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.

Diperbarui