2017-01-26 16 views
10

Tôi đang chạy dịch vụ AWS Lambda được viết bằng Node.js tương tác với cơ sở dữ liệu DynamoDB. Một trong những phương pháp của tôi thực hiện cập nhật (AWS.DynamoDB.DocumentClient(). Update) trên DynamoDB để cập nhật một mục cụ thể. Tuy nhiên, vấn đề của tôi là khi tôi cố cập nhật một mục và mục đó không tồn tại, thì phương thức cập nhật sẽ thêm mục mới này vào bảng của tôi. Hành vi này là mặc định được mô tả trong số documentation.DynamoDB: Cách ngăn chặn tạo mục mới trong UpdateItem nếu mục không tồn tại

Tôi không muốn phương pháp tạo mục mới nếu nó chưa tồn tại. Tôi muốn đây chỉ là bản cập nhật nếu bản ghi tồn tại. Nếu nó không tồn tại, nó không phải làm gì cả. Làm thế nào để đạt được điều này? Tôi hy vọng tôi sẽ có thể sử dụng một ConditionalExpression để đạt được điều này, nhưng những nỗ lực tôi đã thực hiện khi làm điều này đã không thành công.

Ví dụ về các tham số hiện tại mà tôi gửi đến chức năng cập nhật được đưa ra dưới đây. Trong ví dụ này tôi muốn cập nhật cho người dùng biết có userId 123 và tôi muốn thiết lập các lĩnh vực IsActive để 'false' cho người dùng này (nhưng tôi chỉ muốn làm điều này nếu người dùng 123 thực sự tồn tại!)

const params = { 
    TableName: 'users', 
    Key: { 
     userId: '123', 
    }, 
    ExpressionAttributeValues: { 
     ':isActive': 'false' 
    }, 
    UpdateExpression: 'SET isActive = :isActive', 
    ReturnValues: 'ALL_NEW', 
}; 

Trả lời

12

Bạn có thể sử dụng ConditionExpression cho việc này. Bản cập nhật sẽ xảy ra nếu khóa (tức là userId) có mặt và thuộc tính cập nhật (tức là isActive) không bằng với giá trị mới mà bạn đang cố cập nhật.

ConditionExpression: "userId = :userIdVal and isActive <> :isActiveVal", 
ExpressionAttributeValues: { 
    ':isActive' : 'false', 
    ':userIdVal' : '123' 
}, 

EDIT: -

này nên làm việc. Nó phải là ConditionExpression (không phải ConditionalExpression).

var params = { 
TableName: 'users', 
Key: { 
    'userId': '123' 
}, 
UpdateExpression: 'SET isActive = :isActiveVal', 
ConditionExpression: 'userId = :userIdVal and isActive <> :isActiveVal', 
ExpressionAttributeValues: { 
    ':userIdVal' : '123', 
    ':isActiveVal': 'false' 
}, 
ReturnValues: "ALL_NEW" 
}; 
+0

Đây là một trong các tùy chọn tôi đã thực sự thử. Khi tôi làm điều này tôi nhận được một ngoại lệ, ValidationException: Giá trị được cung cấp trong ExpressionAttributeValues ​​không được sử dụng trong các biểu thức: các khóa: {: userIdVal} – Stanley

+0

Có vẻ như bạn chưa cung cấp userIdVal trong biểu thức. Bạn đã bao gồm phần này "userId =: userIdVal" trong ConditionExpression chưa? – notionquest

+0

Thật vậy, tôi đã kiểm tra chính tả và cú pháp. – Stanley

0

ConditionExpression là con đường để đi, nhưng bạn cũng có thể sử dụng attribute_exists chức năng:

ConditionExpression: 'attribute_exists(userId)' 

Nó sẽ chỉ cập nhật phù hợp với chìa khóa chính xác và ném một ConditionalCheckFailedException nếu có yêu cầu then chốt doesn' t tồn tại.

Mục tiêu rõ ràng hơn và bạn có thể bỏ qua thêm ràng buộc userId.

ref: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html

Các vấn đề liên quan