我有一个DynamoDB属性,它的值是从Number到String的映射。我正在尝试放入一个新的键值对。从我读到的内容来看,这似乎是可能的,但我不知道怎么做。
我认为解决方案类似于下面链接中的解决方案:
如何更新AWS DynamoDB文档API上的地图或列表?
但我不认为这个例子是在地图上添加新项目。有人能教我如何把一个项目放在地图上吗?
谢谢。
编辑:
我不想获取该项目,在本地进行更改,然后将其放回原处。我正在与多个可能同时交互的客户合作(我认为dynamo的更新可以确保不会出现竞争条件)。
使用UpdateItem的以下参数,您可以在映射时在#number处添加映射条目#地图中已经不存在数字:
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)"
访问http://www.tryyourskill.com/aws/insert-or-append-key-values-map-in-dynamodb-using-java可以帮助您在映射列中添加或附加值的代码片段
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;
}