2015-09-25 16 views
14

Hãy nói rằng tôi đang lưu trữ hồ sơ với cấu trúc sau đây trong DynamoDB:Có thể thực hiện điều chỉnh hoặc cập nhật có điều kiện trong DynamoDB không?

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

Bây giờ, là nó có thể để đạt được những điều sau đây trong một yêu cầu:

  • nếu kỷ lục với trao id không tồn tại nó phải được tạo với count = 1
  • nếu bản ghi cho rằng id tồn tại bộ đếm đang được cập nhật.

Hiện tại tôi đang thực hiện truy vấn để kiểm tra xem bản ghi có tồn tại hay không và tùy thuộc vào kết quả tôi thực hiện put hoặc update. Nó sẽ là tốt đẹp để gấp đó vào một hoạt động duy nhất.

Trả lời

11

Bạn có thể thực hiện việc này với UpdateItem API và UpdateExpression vì trường hợp sử dụng của bạn. Kể từ count sẽ là một loại Number đây, bạn có thể sử dụng SET hoặc ADD biểu:

Các tài liệu cho ADD nói với bạn rằng bạn có thể sử dụng nó cho Number loại (tôi nhấn mạnh):

  • THÊM - Thêm giá trị được chỉ định cho mục, nếu thuộc tính không tồn tại. Nếu thuộc tính không tồn tại, sau đó hành vi của Thanh phụ thuộc vào kiểu dữ liệu của thuộc tính:

    • Nếu thuộc tính hiện tại là một con số, và nếu Value cũng là một con số, sau đó Value là toán học được thêm vào thuộc tính hiện có. Nếu Giá trị là số âm, thì số này sẽ bị trừ khỏi thuộc tính hiện tại.

    Nếu bạn sử dụng ADD để tăng hoặc giảm giá trị số cho một mục không tồn tại trước bản cập nhật, DynamoDB sử dụng 0 làm giá trị ban đầu. Tương tự, nếu bạn sử dụng ADD cho một mục hiện có để tăng hoặc giảm giá trị thuộc tính không tồn tại trước khi cập nhật, DynamoDB sử dụng 0 làm giá trị ban đầu. Ví dụ: giả sử rằng mục bạn muốn cập nhật không có thuộc tính có tên itemcount, nhưng bạn vẫn quyết định THÊM số 3 cho thuộc tính này. DynamoDB sẽ tạo thuộc tính itemcount, thiết lập giá trị ban đầu của nó là 0, và cuối cùng thêm 3 vào nó. Kết quả sẽ là một thuộc tính ITEMCOUNT mới trong mục này, với giá trị là 3.

Ví dụ, bạn có thể có UpdateExpression của bạn được ADD #c :n, nơi :nExpressionAttributeValue loại Number, 1 là giá trị và #c có thay thế ExpressionAttributeName cho count. Bạn cần sử dụng trình giữ chỗ cho count vì nó là một reserved word.

Xem thêm các ví dụ trên Modifying Items and Attributes with Update Expressions

7

Những gì tôi đã không đề cập trong câu hỏi của tôi là tôi muốn count đi lên cho các sự kiện tiếp theo mà không sửa đổi created_at. UpdateInput làm việc cuối cùng của tôi trông giống như sau:

{ 
    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" 
} 
Các vấn đề liên quan