DynamoDB BatchGetItem di Node.js (AWS SDK v3)

BatchGetItem mengambil hingga 100 item berdasarkan primary key dalam satu request (maksimum 16 MB). Di AWS SDK v3 Anda mengirim BatchGetItemCommand dengan map RequestItems dari tabel → key — dan Anda harus melakukan loop pada UnprocessedKeys, karena sebuah batch secara sah bisa mengembalikan hanya sebagian dari yang Anda minta.

Code

import {BatchGetItemCommand, DynamoDBClient} from '@aws-sdk/client-dynamodb';

const client = new DynamoDBClient({region: 'us-east-1'});

const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));

let requestItems = {
  Music: {
    Keys: [
      {Artist: {S: 'Arturo Sandoval'}, SongTitle: {S: 'Cubano Chant'}},
      {Artist: {S: 'Arturo Sandoval'}, SongTitle: {S: 'A Mis Abuelos'}},
      {Artist: {S: 'Ella Fitzgerald'}, SongTitle: {S: 'Misty'}}
    ]
  }
};

const items = [];
let attempt = 0;

do {
  const response = await client.send(new BatchGetItemCommand({RequestItems: requestItems}));
  items.push(...(response.Responses?.Music ?? []));

  // A partial result is NOT an error: throttling, a >16 MB response, or an
  // internal failure returns the leftovers in UnprocessedKeys. Retry them
  // with exponential backoff.
  requestItems = response.UnprocessedKeys;
  if (requestItems && Object.keys(requestItems).length > 0) {
    attempt += 1;
    await sleep(Math.min(100 * 2 ** attempt, 5000));
  }
} while (requestItems && Object.keys(requestItems).length > 0);

console.log(`Fetched ${items.length} items`);

Penjelasan

  • RequestItems — map dari nama tabel → { Keys: [...] }; satu request bisa mencakup beberapa tabel. Setiap key harus berupa primary key lengkap (partition + sort untuk key komposit). Lebih dari 100 key, atau key yang sama dua kali, gagal dengan ValidationException.
  • Responses — map dari nama tabel → item yang ditemukan. Item kembali dalam urutan yang tidak tertentu, dan key yang tidak ada cukup tidak muncul — cocokkan hasil dengan permintaan berdasarkan atribut key-nya.
  • UnprocessedKeys — loop retry di atas bukan opsional. Jika response melewati 16 MB, throughput habis, atau sebuah pembacaan partition melewati 1 MB, DynamoDB mengembalikan sisanya di sini dalam bentuk RequestItems, siap dimasukkan kembali. AWS sangat menyarankan exponential backoff di antara percobaan ulang — retry langsung cenderung menabrak throttle yang sama lagi.
  • Konsistensi — pembacaan batch bersifat eventually consistent secara default; setel ConsistentRead: true per tabel untuk pembacaan strongly-consistent.
  • Per tabel Anda juga bisa melewatkan ProjectionExpression (dengan ExpressionAttributeNames) untuk mengambil hanya sebagian atribut.
  • BatchGetItem mungkin mengambil item secara paralel di sisi server — ia menghemat perjalanan bolak-balik, bukan kapasitas baca: DynamoDB menagih setiap item dalam batch sebagai GetItem individual.

Lakukan secara visual

Lebih suka tidak merakit map key DynamoDB-JSON dengan tangan? DynamoDB Expression Builder membangun map key/value bertipe dan menyalin kode yang bisa dijalankan, dan kalkulator ukuran item menunjukkan seberapa dekat sebuah batch dengan plafon 16 MB.

Untuk mengambil dan memeriksa item di seluruh tabel dalam GUI — tanpa loop retry untuk ditulis — unduh DynoTable.

Contoh terkait

References

Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Bekerja dengan DynamoDB tanpa Console

DynoTable adalah klien desktop yang cepat untuk DynamoDB — jelajahi tabel, jalankan query gaya SQL, dan edit Item secara lokal.