2015-06-30 30 views
9

Tôi có một thuộc tính DynamoDB có giá trị là một bản đồ từ một số đến một chuỗi. Tôi đang cố gắng đưa vào một cặp khóa-giá trị mới. Từ những gì tôi đã đọc, điều này có vẻ là có thể, nhưng tôi không biết làm thế nào.Làm thế nào để đặt cặp khóa-giá trị mới vào bản đồ trong DynamoDB? (java)

Tôi giả sử các giải pháp tương tự như một trong các liên kết dưới đây:

How to update a Map or a List on AWS DynamoDB document API?

Nhưng tôi không tin ví dụ là trên đưa vào một mục mới vào bản đồ. Ai đó có thể chỉ cho tôi cách đặt một vật phẩm vào bản đồ?

Cảm ơn.

EDIT:

Tôi không muốn nhận mặt hàng, thay đổi cục bộ các thay đổi và đặt lại. Tôi đang làm việc với nhiều khách hàng có thể tương tác đồng thời (và tôi cho rằng bản cập nhật của máy phát điện đảm bảo sẽ không có điều kiện chủng tộc).

Trả lời

14

Với những lập luận sau đây để UpdateItem, bạn có thể đặt điều kiện thêm một mục bản đồ tại #number khi bản đồ # số không tồn tại trong bản đồ đã:.

UpdateExpression = "SET map.#number = :string" 
ExpressionAttributeNames = { "#number" : "1" } 
ExpressionAttributeValues = { ":string" : "the string to store in the map at key value 1" } 
ConditionExpression = "attribute_not_exists(map.#number)" 
+0

đẹp cách tiếp cận, nhưng những gì về khi không có trước 'lĩnh vực map' bên dynamo? nó ném 'Đường dẫn tài liệu được cung cấp trong biểu thức cập nhật không hợp lệ cho bản cập nhật' nếu bạn cố gắng cập nhật bản ghi mới, tôi không thể tìm cách tạo Mục mới nếu trường trước đó không tồn tại, bất kỳ trợ giúp nào? – user2976753

+1

Điều kiện cập nhật trên "attribute_exists (map) và attribute_not_exists (bản đồ. # Number)", sau đóCắt kiểm tra có điều kiện ngoại lệ không thành công và thử một yêu cầu updateItem khác SET rằng =: m, attribute_not_exists (map). Hãy nhớ rằng, bạn luôn có thể tạo mục với một bản đồ trống! –

+0

cảm ơn. tôi đã đi ra khỏi tâm trí của tôi không thể thêm một thuộc tính mới và giá trị cho một bản đồ. nó tiếp tục thêm thuộc tính vào bảng. sau đó tôi thấy cách bạn chỉ ra đường dẫn đến bản đồ (bản đồ. # number) trong ví dụ của bạn ở trên. bây giờ mã của tôi hoạt động! cảm ơn. –

2

Visit http://www.tryyourskill.com/aws/insert-or-append-key-values-map-in-dynamodb-using-java có thể giúp bạn với các đoạn mã để thêm hoặc nối các giá trị trong cột đồ

public boolean insertKeyValue(String tableName, String primaryKey, String primaryKeyValue, String updateColumn,String newKey, String newValue){ 

//Configuration to connect to DynamoDB 
Table table = dynamoDB.getTable(tableName); 
boolean insertAppendStatus = false; 
try{ 
//Updates when map is already exist in the table 
UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey(primaryKey,primaryKeyValue).withReturnValues(ReturnValue.ALL_NEW). 
     withUpdateExpression("set #columnName." + newKey + " = :columnValue"). 
     withNameMap(new NameMap().with("#columnName", updateColumn)). 
     withValueMap(new ValueMap().with(":columnValue", newValue)).withConditionExpression("attribute_exists("+ updateColumn +")"); 

table.updateItem(updateItemSpec); 
insertAppendStatus = true; 
//Add map column when it's not exist in the table 
}catch (ConditionalCheckFailedException e) { 
    HashMap<String, String> map = new HashMap<>(); 
    map.put(newKey, newValue); 
    UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey(primaryKey,primaryKeyValue).withReturnValues(ReturnValue.ALL_NEW). 
     withUpdateExpression("set #columnName = :m"). 
      withNameMap(new NameMap().with("#columnName", updateColumn)) 
      .withValueMap(new ValueMap().withMap(":m", map)); 

    table.updateItem(updateItemSpec); 
    insertAppendStatus = true; 
} catch(Exception e){ 
    e.printStackTrace(); 
} 
return insertAppendStatus; 

}

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