可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a DynamoDB attribute whose value is a map from a Number to a String. I am trying to put in a new key-value pair. From what I've read, this seems to be possible, but I don't know how.
I assume the solution is similar to the one in the link below:
How to update a Map or a List on AWS DynamoDB document API?
But I do not believe the example is on putting in a new item to a map. Could someone show me how to put in an item to a map?
Thanks.
EDIT:
I do not want to get the item, locally make the changes, and put it back. I am working with multiple clients who might interact concurrently (and I assume the update by dynamo ensures there will be no race conditions).
回答1:
With the following arguments to UpdateItem, you can condition adding a map entry at #number when map.#number does not exist in the map already:
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)"
回答2:
Visit http://www.tryyourskill.com/aws/insert-or-append-key-values-map-in-dynamodb-using-java may help you with the code snippet to add or append values in map column
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; }