2014-10-21 19 views
10

Tôi đang cố gắng sử dụng Amazon DynamoDB JSON API mới để thêm/ghi đè cặp khóa-giá trị trong thuộc tính JSON được gọi là "tài liệu". Lý tưởng nhất, tôi chỉ muốn cấu trúc các cuộc gọi viết của tôi để gửi các cặp KV để thêm vào thuộc tính và có Dynamo tạo thuộc tính nếu nó không tồn tại cho khóa chính đã cho. Tuy nhiên nếu tôi cố gắng này chỉ với một đơn giản UpdateItemSpec:API DynamoDB: Làm cách nào tôi có thể tạo yêu cầu cập nhật "thêm thuộc tính JSON nếu không có"?

PrimaryKey primaryKey = new PrimaryKey("key_str", "mapKey"); 
ValueMap valuesMap = new ValueMap().withLong(":a", 1234L).withLong(":b", 1234L); 
UpdateItemSpec updateSpec = new UpdateItemSpec().withPrimaryKey(primaryKey).withUpdateExpression("SET document.value1 = :a, document.value2 = :b"); 
updateSpec.withValueMap(valuesMap); 
table.updateItem(updateSpec); 

tôi nhận được com.amazonaws.AmazonServiceException: The document path provided in the update expression is invalid for update, có nghĩa DynamoDB không thể tìm thấy thuộc tính nhất định đặt tên là "tài liệu" mà để áp dụng bản cập nhật.

tôi quản lý để xấp xỉ chức năng này với hàng loạt sau cuộc gọi:

try { 
    // 1. Attempt UpdateItemSpec as if attribute already exists 
} catch (AmazonServiceException e) { 
    // 2. Confirm the exception indicated the attribute was not present, otherwise rethrow it 
    // 3. Use a put-if-absent request to initialize an empty JSON map at the attribute "document" 
    // 4. Rerun the UpdateItemSpec call from the above try block 
}  

này hoạt động, nhưng là ít hơn lý tưởng vì nó sẽ yêu cầu 3 cuộc gọi đến DynamoDB mỗi khi tôi thêm một khóa chính mới đến bàn. Tôi đã thử nghiệm một chút với hàm attribute_not_exists có thể được sử dụng trong Update Expressions, nhưng không thể làm cho nó hoạt động theo cách tôi muốn.

Bất kỳ chuyên gia về Dynamo nào cũng có bất kỳ ý tưởng nào về cách thức thực hiện điều này hay không?

Trả lời

4

Tôi đã nhận được câu trả lời từ bộ phận Hỗ trợ của Amazon rằng thực tế không thể thực hiện điều này chỉ bằng một cuộc gọi. Họ đã đề xuất giảm số lượng cuộc gọi khi thêm thuộc tính cho khóa chính mới từ 3 đến 2, bằng cách sử dụng bản đồ JSON mong muốn trong yêu cầu put-if-absent thay vì bản đồ trống.

+3

Tôi thực sự muốn xem mã ở đây vì tôi đang đối mặt với cùng một thách thức. API DynamoDB đánh tôi như một đứa trẻ ngây thơ. –

+1

Bất kỳ ý tưởng nào nếu câu trả lời này vẫn áp dụng ngay bây giờ? (hy vọng họ đã thay đổi điều gì đó từ năm 2014) – Nadine

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