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) ve AND/OR/NOT.
  • İki temel deyim:
    • Bir güncellemede attribute_exists(#key) = "yalnızca güncelle, asla oluşturma". Bu olmadan, var olmayan bir anahtar üzerindeki UpdateItem öğ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.
  • İyimser kilitleme — öğeyi okuyun (sürüm 7), ardından 8'e yükseltirken #version = :expectedVersion ile yazın. İki eşzamanlı yazıcı ikisi birden kazanamaz; kaybeden ConditionalCheckFailedException alı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 eden GetItem'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 ExpressionAttributeNames aracılığıyla bir takma ad alır (#versionVersion), 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

References

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalışın

DynoTable, DynamoDB için hızlı bir masaüstü istemcisidir — tablolara göz atın, SQL tarzı sorgular çalıştırın ve item'ları yerel olarak düzenleyin.