Я пытаюсь использовать новый Amazon DynamoDB JSON API, чтобы добавить/перезаписать пары ключ-значение в атрибуте JSON под названием "document". В идеале я хотел бы просто структурировать свои вызовы записи для отправки пар KV для добавления в атрибут и создать Dynamo для этого атрибута, если он еще не существует для данного первичного ключа. Однако, если я попробую сделать это с помощью простого UpdateItemSpec
:
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);
Я получаю com.amazonaws.AmazonServiceException: The document path provided in the update expression is invalid for update
, что означает, что DynamoDB не смог найти данный атрибут с именем "document", к которому применяется обновление.
Мне удалось сопоставить эту функциональность со следующими сериями вызовов:
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
}
Это работает, но является менее идеальным, так как для каждого из них требуется 3 вызова DynamoDB каждый раз, когда я добавляю новый первичный ключ в таблицу. Я немного экспериментировал с функцией attribute_not_exists
, которая может использоваться в Обновить выражения, но не смогла заставить ее работать в пути Я хочу.
Любые гуру динамо-вузов есть идеи о том, как это сделать?