Как поместить новую пару ключ-значение в карту в DynamoDB? (Джава)
У меня есть атрибут DynamoDB, значением которого является карта из числа в строку. Я пытаюсь вставить новую пару ключ-значение. Из того, что я прочитал, это кажется возможным, но я не знаю как.
Я предполагаю, что решение аналогично приведенному в ссылке ниже:
Как обновить карту или список в API документов AWS DynamoDB?
Но я не верю, что пример - это добавление нового элемента на карту. Может ли кто-нибудь показать мне, как поместить элемент на карту?
Благодарю.
РЕДАКТИРОВАТЬ:
Я не хочу получать товар, локально вносить изменения и возвращать его обратно. Я работаю с несколькими клиентами, которые могут взаимодействовать одновременно (и я полагаю, что обновление по динамо гарантирует отсутствие гоночных условий).
2 ответа
Используя следующие аргументы для UpdateItem, вы можете условно добавить запись карты в #number, когда map.# 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;
}