Node.js (AWS SDK v3) ile DynamoDB Tablosundaki Tüm Öğeleri Alma
SDK v3'te bütün bir tabloyu okumak, bir Scan'i sonuna kadar sayfalamak demektir. Her yanıt 1 MB ile sınırlıdır ve biri geri gelmeyi kesene kadar LastEvaluatedKey'i ExclusiveStartKey olarak geri beslersiniz (DynamoDB imleçleri nasıl çalışır).
Aşağıdaki döngü, imleç görünür olsun diye elle yazılmıştır. Gerçek kodda, SDK'nın zaten sunduğu paginateScan'e uzanırdınız.
Kod
import {DynamoDBClient, ScanCommand} from '@aws-sdk/client-dynamodb';
const client = new DynamoDBClient({region: 'us-east-1'});
const items = [];
let lastEvaluatedKey;
do {
const response = await client.send(
new ScanCommand({
TableName: 'Music',
ExclusiveStartKey: lastEvaluatedKey
})
);
items.push(...(response.Items ?? []));
lastEvaluatedKey = response.LastEvaluatedKey;
} while (lastEvaluatedKey);
console.log(`Table holds ${items.length} items`);Açıklama
paginateScanbunu zaten yapıyor —import {paginateScan} from '@aws-sdk/client-dynamodb', ardındanfor await (const page of paginateScan({client}, {TableName: 'Music'})). Yukarıdaki döngünün elle kullandığı aynı üç imleç alanından (ExclusiveStartKey,LastEvaluatedKey,Limit) üretilmiştir, dolayısıyla geçiş yaptığınızda davranışı hiçbir şey değiştirmez.- Yalnızca
LastEvaluatedKey'in yokluğu bitti demektir — sıfırItemsve bir imleç içeren bir yanıt normaldir, boş bir tablo değil.Items.length === 0üzerinde durmak klasik eksik-satır hatasıdır ve birFilterExpression, boş sayfaları nadir değil rutin hâle getirir. Limit, çağrı başına değerlendirilen öğeleri sayar, toplam öğeleri değil — sayfalayıcının sürdüğü üçüncü alandır ve ne o ne de sayfalayıcınınpageSize'ı, sonunda elinizde tutacağınız dizinin boyutunu sınırlar.- İlk geçişte
ExclusiveStartKey: undefinedsorun değildir — serileştirici tanımsız üyeleri düşürür, dolayısıyla ilk yineleme özel bir duruma ihtiyaç duymaz. items, tablonun boyutuna kadar büyür — tablonun küçük olduğunu bilmiyorsanız her sayfayı döngünün içinde işleyin ve bırakın gitsin (yazın, akıtın, toplayın). Biriktirmek, bellek yetersizliğiyle çökmekten bir tablo büyümesi uzaktır.- Bir tarama, okuduğu her baytı her çalıştırmada faturalandırır —
ProjectionExpressionkablodan geçeni küçültür, faturayı değil (nedeni) ve birFilterExpressionöğeleri okunup ücretlendirildikten sonra düşürür (filtreli Scan). Sıcak bir yolda Query istersiniz. - Onu
Segment/TotalSegmentsile bölün — her biri kendi dilimi üzerinde kendi imlecini süren N eşzamansız işçi, hepsi tek bir paylaşılan istemci üzerinde. Node onları seve seve eşzamanlı çalıştırır; okuma maliyeti değişmez, yalnızca duvar saati değişir (bunun ne zaman değdiği).
Görsel olarak yapın
DynamoDB sorgu oluşturucu bu programın tamamını, sayfalama döngüsü dahil, bir formdan üretir — SDK v3 ve yedi hedef daha için.
DynoTable canlı bir tabloyu sizin için sonsuz kaydırmalı bir ızgarada sayfalar ve o ızgaranın arkasındaki Scan'i çalıştırılabilir kod olarak dışa aktarır. DynoTable'ı indirin.
İlgili örnekler
- Python ile tüm öğeleri alma — aynı tam okuma, boto3'ün sayfalayıcısıyla.
- AWS CLI ile tüm öğeleri alma — CLI sizin yerinize sayfalar.
- Node.js ile DynamoDB Scan — bir
FilterExpressionile tarama. - Paralel taramalar — Segment/TotalSegments, işçi sayıları ve ne zaman uğraşmaya değdiği.
- DynamoDB Scan'im neden yavaş ve pahalı? — maliyet modeli ve ondan nasıl kaçınılacağı.
- DynamoDB ProvisionedThroughputExceededException — tablonun tamamını okumak, ona çarpmanın klasik yoludur.
- "The provided starting key is invalid" — sayfalama döngüsünde bozulmuş bir devam anahtarı.
Kaynaklar
- Scan — Amazon DynamoDB API Reference
- Scanning tables in DynamoDB — Amazon DynamoDB Developer Guide
- DynamoDB read and write operations (capacity unit consumption) — Amazon DynamoDB Developer Guide
- [
paginateScan— AWS SDK for JavaScript v3 source](https://github.com/aws/aws-sdk-js-v3/blob/main/the client-dynamodb ScanPaginator module)
En son 2026-07-28 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.