Node.js'te DynamoDB Scan (AWS SDK v3)
Aşağıdaki do/while savunmacı kodlama değildir. Filtrelenmiş bir Scan sayfası boş bir Items dizisiyle geri gelebilir ve tablonun geri kalanı hâlâ duruyor olabilir; dolayısıyla ilk yanıtta durmak, bir taramanın eşleşme barındıran bir tabloda sıfır eşleşme bildirmesinin yoludur. Query ile Scan işlemden tümüyle ne zaman kaçınmanız gerektiğini ele alır.
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',
FilterExpression: '#filter0 >= :filterValue0',
ExpressionAttributeNames: {
'#filter0': 'Year'
},
ExpressionAttributeValues: {
':filterValue0': {N: '2010'}
},
ExclusiveStartKey: lastEvaluatedKey
})
);
items.push(...(response.Items ?? []));
lastEvaluatedKey = response.LastEvaluatedKey;
} while (lastEvaluatedKey);
console.log(`Matched ${items.length} items`);İki boş sayfa, 284,5 okuma birimi, 8 öğe
Düzenek, her biri yaklaşık 3,9 KB olan 600 şarkıdır; bunlardan tam olarak 8'i Year >= 2010 taşır ve en sona sıralanır. Yukarıdaki döngünün gerçekte aldığı şey şu:
| Gidiş-dönüş | Items.length | ScannedCount | Okuma birimi | LastEvaluatedKey |
|---|---|---|---|---|
| 1 | 0 | 271 | 128,5 | var |
| 2 | 0 | 271 | 128,5 | var |
| 3 | 8 | 58 | 27,5 | yok |
Art arda iki sayfa hiçbir şey döndürür ve her biri 128,5 okuma birimine mal olur. if (!response.Items.length) return yapan kod boş bir tablo bildirir. API başvurusu kuralı açıkça belirtir: "a scan result can result in no items meeting the criteria and the Count will result in zero" ve ayrıca "a FilterExpression is applied after the items have already been read; the process of filtering does not consume any additional read capacity units".
O ikinci cümleyi faturanızın okuduğu gibi okuyun. Filtre bedavadır, attığı her şey değil: 8 öğe teslim etmek için 284,5 okuma birimi — hiç filtre kullanmasanız da ödeyeceğiniz faturanın aynısı.
2026-07-28 tarihinde node v24.18.0 üzerinde @aws-sdk/client-dynamodb 3.1095.0 ile, DynamoDB Local'e (amazon/dynamodb-local) karşı ölçüldü. Sayımlar ve kapasite, motorun kendi yanıt alanlarıdır.
Açıklama
- İlk geçişte
ExclusiveStartKey: lastEvaluatedKeyundefined'dır. v3 serileştiricisiundefinedüyeleri düşürür; dolayısıyla tek bir nesne değişmezi hem ilk isteği hem de sonraki her isteği karşılar. Onun yerine{}geçmekValidationException: The provided starting key is invalidile başarısız olur. response.Items ?? []gerçek bir iş yapıyor. Onu yukarıdaki tabloyla birleştirin: null birleştirme, hiçbir şeyle eşleşmeyen sayfalarda biriktiriciyi dürüst tutar vewhiledöngüyü onların ötesinde canlı tutar.#filter0süs değildir.Year, AWS'nin ayrılmış sözcük listesindedir ve takma adsız kullanmakValidationException: Invalid FilterExpression: Attribute name is a reserved keyword; reserved keyword: Yeardöndürür.Limit, döndürülen öğeleri değil okunan öğeleri sayar. Bu filtreyleLimit: 10Count: 0veScannedCount: 10verir. O, kapasite sıçramaları için bir kısıtlama düğmesidir, on sonuç istemenin yolu değil.Segment/TotalSegmentstam tablo taramasını işçiler arasında böler. Bu, maliyeti değil duvar saatini böler — aynı 284,5 birim harcanır, yalnızca daha hızlı ve daha eşzamanlı.
Bu, gerçek bir tabloda neye mal olur
8 öğe için 284,5 okuma birimi sorunun şeklidir ve sonuçla değil tabloyla doğru orantılı ölçeklenir. Sıcak bir yolda filtrelenmiş bir taramayı sahaya sürmeden önce, tam tablo okumasını kendi öğe boyutunuz ve trafiğinizle DynamoDB fiyatlandırma hesaplayıcısında fiyatlandırın, sonra bunu aynı erişim desenini bir Query'ye dönüştüren bir GSI ile karşılaştırın.
Tabloları filtrelenmiş ve sayfalanmış sonuç ızgaralarıyla bir GUI'de keşfetmek için, bir betikten körlemesine taramak yerine DynoTable'ı indirin.
İlgili kılavuzlar
- Query ile Scan — bir
Scanne zaman (nadiren) haklı çıkar. - DynamoDB Scan'im neden yavaş ve pahalı? — maliyet modeli ve ondan nasıl kaçınılır.
- DynamoDB ProvisionedThroughputExceededException — tam tablo taramasının sağlanan bir tablonun kapasitesine yaptığı şey.
- DynamoDB ThrottlingException — diğer kısıtlama ve üstel geri çekilmenin onu nasıl ele aldığı.