API DynamoDB: как я могу создать запрос "добавить JSON-атрибут, если нет"?

Я пытаюсь использовать новый 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, которая может использоваться в Обновить выражения, но не смогла заставить ее работать в пути Я хочу.

Любые гуру динамо-вузов есть идеи о том, как это сделать?

Ответ 1

Я получил ответ от Amazon Support, что на самом деле это невозможно сделать одним разом. Они предлагали уменьшить количество вызовов при добавлении атрибута для нового первичного ключа с 3 по 2, используя желаемую карту JSON в запросе put-if-abs, а не пустую карту.