Node.js'te DynamoDB BatchGetItem (AWS SDK v3)
BatchGetItem, tek bir istekte birincil anahtara göre 100'e kadar öğe getirir (en fazla 16 MB). AWS SDK v3'te, tablo → anahtarlar şeklinde bir RequestItems eşlemesi içeren bir BatchGetItemCommand gönderirsiniz — ve UnprocessedKeys üzerinde döngü yapmak zorundasınız, çünkü bir toplu istek yasal olarak istediğinizin yalnızca bir kısmını döndürebilir.
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`);Açıklama
RequestItems— tablo adı →{ Keys: [...] }şeklinde bir eşleme; bir istek birden çok tabloya yayılabilir. Her anahtar tam birincil anahtar olmalıdır (bileşik bir anahtar için bölüm + sıralama). 100'den fazla anahtar ya da aynı anahtarın iki kez geçmesi birValidationExceptionile başarısız olur.Responses— tablo adı → bulunan öğeler şeklinde bir eşleme. Öğeler belirli bir sırada olmadan döner ve var olmayan anahtarlar basitçe görünmez — sonuçları anahtar özniteliklerine göre isteklerle eşleştirin.UnprocessedKeys— yukarıdaki yeniden deneme döngüsü isteğe bağlı değildir. Yanıt 16 MB'ı aşarsa, iş hacmi tükenirse ya da bir bölüm okuması 1 MB'ı aşarsa, DynamoDB kalanı buradaRequestItemsbiçiminde döndürür ve doğrudan geri beslenmeye hazırdır. AWS, yeniden denemeler arasında üstel geri çekilmeyi şiddetle önerir — anında yapılan bir yeniden deneme aynı kısıtlamaya tekrar takılma eğilimindedir.- Tutarlılık — toplu okumalar varsayılan olarak nihai tutarlıdır; güçlü tutarlı okumalar için tablo başına
ConsistentRead: trueayarlayın. - Tablo başına, yalnızca bazı öznitelikleri getirmek için ayrıca
ProjectionExpression(ExpressionAttributeNamesile) geçirebilirsiniz. BatchGetItem, öğeleri sunucu tarafında paralel olarak alabilir — okuma kapasitesini değil, gidiş-dönüşleri kurtarır: DynamoDB, toplu istekteki her öğeyi ayrı birGetItemolarak faturalandırır.
Görsel olarak yapın
DynamoDB-JSON anahtar eşlemelerini elle bir araya getirmemeyi mi tercih edersiniz? DynamoDB Expression Builder, türlü anahtar/değer eşlemeleri oluşturur ve çalıştırılabilir kodu kopyalar; öğe boyutu hesaplayıcı ise bir toplu isteğin 16 MB tavanına ne kadar yaklaştığını gösterir.
Yeniden deneme döngüleri yazmadan, tablolar arası öğeleri bir grafik arayüzde (GUI) getirmek ve incelemek için — DynoTable'ı indirin.
İlgili örnekler
- Python'da DynamoDB BatchGetItem — boto3 ile aynı toplu okuma.
- AWS CLI ile DynamoDB BatchGetItem — kabuktan aynı toplu okuma.
- Node.js'te DynamoDB GetItem — bunun toplu hâle getirdiği tek öğe okuması.
- DynamoDB'de toplu işlemler — sınırlar, kısmi başarısızlık ve toplu işlemenin ne zaman kazandırdığı.
- "Too many items requested for the BatchGetItem call" — bir istekte 100'den fazla anahtar.
- "Provided list of item keys contains duplicates" — bir toplu istekte aynı anahtarın iki kez geçmesi.
References
- BatchGetItem — Amazon DynamoDB API Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
- DynamoDB read and write operations (capacity unit consumption) — Amazon DynamoDB Developer Guide
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.