2015-09-25 21 views
14

ı DynamoDB aşağıdaki yapıya sahip kayıtları saklamak ediyorum varsayalım: Verilen id ile rekor yapmazsaDynamoDB'de koşullu bir düzenleme veya güncelleme yapmak mümkün mü?

  • : Artık

    {  
        "id": "57cf5b43-f9ec-4796-9de6-6a50f556cfd8", 
        "created_at": "2015-09-18T13:27:00+12:00", 
        "count": 3 
    } 
    

    , bu bir istek aşağıdaki başarmak mümkündür Varsa, bu id için kayıt mevcutsa, sayı = 1

  • ile oluşturulmalıdır.

Şu anda rekor var ve sonucuna göre bir put veya update yaparsanız kontrol etmek için bir sorgu yapıyorum. Bunu tek bir operasyona katlamak güzel olurdu.

cevap

11

Bunu, kullanım durumunuz nedeniyle UpdateItem API ve UpdateExpression ile yapabilirsiniz. count burada Number türü olacak olduğundan, SET veya ADD ifadeleri kullanabilirsiniz:

ADD için dokümantasyon Number türleri (vurgu benim) için kullanabilirsiniz söylerse:

  • ADD - Öznitelik yoksa, belirtilen değeri öğeye ekler. nitelik olarak varsa, o zaman ADD'nin davranış özelliğinin verileri türüne bağlıdır: Mevcut özelliğin bir dizi ise

    • ve eğer Değer sonra Değer matematiksel olarak ise, aynı zamanda bir sayıdır mevcut özniteliğe eklendi. Değer negatif bir sayıysa, mevcut öznitelikten çıkarılır.

    Eğer artırır veya güncellemeden önce var olmayan bir öğe için bir dizi değer azaltma ADD kullanırsanız, DynamoDB başlangıç ​​değeri olarak 0 kullanır. Benzer şekilde, varolan bir öğe için ADD'yi, güncelleştirmeden önce var olmayan bir öznitelik değerini artırmak veya azaltmak için kullanırsanız, DynamoDB, başlangıç ​​değeri olarak 0 değerini kullanır. Örneğin, güncellemek istediğiniz öğenin itemcount adlı bir özniteliğe sahip olmadığını, ancak yine de bu özniteliğe 3 sayısını ADR yapmaya karar verdiğinizi varsayalım. DynamoDB itemcount özniteliğini oluşturacak, başlangıç ​​değerini 0'a ayarlayacak ve son olarak 3'e ekleyecektir. Sonuç sizin Örneğin 3.

bir değerle, kaleminde yeni ITEMCOUNT özelliği olur, sen 1 senin UpdateExpression:nNumber türünde bir ExpressionAttributeValue sahiptir ADD #c :n olmak olabilir değerdir ve #c, count için ExpressionAttributeName yerine geçer. count için bir yer tutucu kullanmanız gerekir, çünkü bu bir reserved word.

Sorumun içinde söz etmedi Ne countcreated_at değiştirmeden sonraki olaylar için yukarı gitmek istedim oldu Modifying Items and Attributes with Update Expressions

7

daha örneklere bakın. Son çalışma UpdateInput şu şekilde görünüyor:

{ 
    Key: { 
    id: { 
     S: "some_unique_id" 
    } 
    }, 
    TableName: "test", 
    ExpressionAttributeNames: { 
    #t: "created_at", 
    #c: "count" 
    }, 
    ExpressionAttributeValues: { 
    :t: { 
     S: "2015-09-26T15:58:57+12:00" 
    }, 
    :c: { 
     N: "1" 
    } 
    }, 
    UpdateExpression: "SET #t = if_not_exists(#t, :t) ADD #c :c" 
} 
İlgili konular