Node.js'te DynamoDB Koşullu Yazma (AWS SDK v3)
Bir koşullu yazma, bir PutItem, UpdateItem veya DeleteItem'a bir ConditionExpression iliştirir: DynamoDB bunu mevcut öğeye karşı değerlendirir ve yazmayı yalnızca geçerliyse uygular — atomik olarak, oku-değiştir-yaz yarışı olmadan. Bu, DynamoDB'nin iyimser-kilitleme ilkelidir. Bu örnek, bir güncellemeyi bir sürüm kontrolüyle korur.
Code
import {DynamoDBClient, UpdateItemCommand} from '@aws-sdk/client-dynamodb';
const client = new DynamoDBClient({region: 'us-east-1'});
// Update the item only if nobody changed it since we read version 7.
const command = new UpdateItemCommand({
TableName: 'Music',
Key: {
Artist: {S: 'Arturo Sandoval'},
SongTitle: {S: 'Cubano Chant'}
},
UpdateExpression: 'SET #upd0 = :updValue0, #version = :newVersion',
ConditionExpression: 'attribute_exists(#cond0) AND #version = :expectedVersion',
ExpressionAttributeNames: {
'#upd0': 'Genre',
'#version': 'Version',
'#cond0': 'Artist'
},
ExpressionAttributeValues: {
':updValue0': {S: 'Latin Jazz'},
':expectedVersion': {N: '7'},
':newVersion': {N: '8'}
},
ReturnValuesOnConditionCheckFailure: 'ALL_OLD'
});
try {
await client.send(command);
console.log('Updated to version 8');
} catch (err) {
if (err.name === 'ConditionalCheckFailedException') {
// With ReturnValuesOnConditionCheckFailure: 'ALL_OLD', the current item
// rides back on the exception — no extra read to see what beat you.
console.log('Lost the race — item is now:', err.Item);
} else {
throw err;
}
}Açıklama
ConditionExpression— yazmayla atomik olarak depolanan öğeye karşı kontrol edilir. Kullanılabilir işlevler:attribute_exists,attribute_not_exists,attribute_type,contains,begins_with,size, artı karşılaştırıcılar (=,<>,<,>,<=,>=,BETWEEN,IN) veAND/OR/NOT.- İki temel deyim:
- Bir güncellemede
attribute_exists(#key)= "yalnızca güncelle, asla oluşturma". Bu olmadan, var olmayan bir anahtar üzerindekiUpdateItemöğeyi sessizce oluşturur (kazara-upsert hatası). - Bir put'ta
attribute_not_exists(#key)= "yalnızca oluştur, asla üzerine yazma" — PutItem sayfasında gösterilmiştir.
- Bir güncellemede
- İyimser kilitleme — öğeyi okuyun (sürüm 7), ardından 8'e yükseltirken
#version = :expectedVersionile yazın. İki eşzamanlı yazıcı ikisi birden kazanamaz; kaybedenConditionalCheckFailedExceptionalır, yeniden okur ve yeni sürümde yeniden dener. ReturnValuesOnConditionCheckFailure: 'ALL_OLD'— mevcut öğeyi istisnaya (err.Item, marshal edilmiş) koyar; başarısız bir kontrolden sonra takip edenGetItem'i ortadan kaldırır. Hiç okuma kapasitesi tüketmez; başarısız bir koşullu yazma yine de yazma denemesini faturalandırır.- Buradaki her şey
ExpressionAttributeNamesaracılığıyla bir takma ad alır (#version→Version), böylece ayrılmış sözcükler asla sorun çıkarmaz.
Görsel olarak yapın
Koşul ifadeleri tam olarak DynamoDB Expression Builder'ın oluşturduğu şeydir — işlevi seçin, ifadeyi + ad/değer eşlemelerini çalıştırılabilir kod olarak alın.
Elle yazılan yer tutucular yerine üretilen, gözden geçirilebilir ifadelerle öğeleri düzenlemek için — DynoTable'ı indirin.
İlgili örnekler
- Python'da DynamoDB koşullu yazma — boto3 ile aynı iyimser kilit.
- AWS CLI ile DynamoDB koşullu yazma — kabuktan aynı iyimser kilit.
- Node.js'te DynamoDB PutItem — yalnızca-oluşturma
attribute_not_existsput'u. - DynamoDB koşul ifadeleri — desenlerle birlikte her işlev.
- Birden çok öznitelikte benzersizliği zorunlu kılma — koşullar + işlemler birlikte.
- DynamoDB ConditionalCheckFailedException — başarısız kontrol beklendiğinde ve bunun ucuza nasıl ele alınacağı.
References
- UpdateItem — Amazon DynamoDB API Reference
- Condition expressions — 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ı.