Недопустимое выражение UpdateExpression при попытке обновить DynamoDB SDK с версии 1 до версии 2.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Недопустимое выражение UpdateExpression при попытке обновить DynamoDB SDK с версии 1 до версии 2.

Сообщение Anonymous »

Я пытаюсь обновить свой клиент DynamoDB с SDK 1 до SDK 2 (полные версии внизу), и столкнулся со странной проблемой. Сервер не изменился (буквально обращаясь к одним и тем же таблицам).
Мы пытаемся использовать одно и то же выражение UpdateExpression как для вставки, так и для обновления.
В версии 1.11.954 оно работает для обоих, но
в версии 2.38.2 оно работает только для обновления.
при вставке я получаю довольно бесполезную информацию

Код: Выделить всё

software.amazon.awssdk.services.dynamodb.model.DynamoDbException: The document path provided in the update expression is invalid for update (Service: DynamoDb, Status Code: 400, Request ID: ...) (SDK Attempt Count: 1)
и, казалось бы, он не совсем недействителен, поскольку он работает для обновления, а в версии 1.x он работает как для вставки, так и для обновления.
Запрос выглядит так:

Код: Выделить всё

updateExpression:
set #key1 = :val1,
#key2 = if_not_exists(#key2, :zero) + :one,
#data.#totalScore = :data_totalScore,
#data.#highScore = :data_highScore,
#data.#fastestTime = :data_fastestTime,
#key3 = :val3,
#key4 = :val4,
#key5 = :val5,
#key6 = :val6,
#key7 = :val7

nameMap: {
#key1=timestamp,
#key2=totalWrites,
#data=data,
#totalScore=totalScore,
#highScore=highScore,
#fastestTime=fastestTime,
#key3=experienceId,
#key4=guestIdType,
#key5=guestId,
#key6=history,
#key7=expiry
}
valueMap: {
:zero=AttributeValue(N=0),
:one=AttributeValue(N=1),
:val1=AttributeValue(S=2025-11-14T20:01:53.221535Z),
:data_totalScore=AttributeValue(N=444),
:data_highScore=AttributeValue(N=441),
:data_fastestTime=AttributeValue(N=44),
:val3=AttributeValue(S=dan.test.temp),
:val4=AttributeValue(S=swid),
:val5=AttributeValue(S={TEST-SWID-LOCAL3}),
:val6=AttributeValue(L=[]),
:val7=AttributeValue(N=1791921713)
}
Обратите внимание, что данные — это карта, и мы не пытаемся ничего сделать для ее создания. Кажется, это работает в версии 1, но не в версии 2.
Если мы попытаемся создать карту, добавив

Код: Выделить всё

#data = if_not_exists(#data, :mapKey1)
с :mapKey1=AttributeValue(M={})
для итогового выражения, например

Код: Выделить всё

set #key1 = :val1, #key2 = if_not_exists(#key2, :zero) + :one, #data.#totalScore = :data_totalScore, #data.#highScore = :data_highScore, #data.#fastestTime = :data_fastestTime, #key3 = :val3, #key4 = :val4, #key5 = :val5, #key6 = :val6, #key7 = :val7
получаем

Код: Выделить всё

DynamoDbException: Invalid UpdateExpression: Two document paths overlap with each other; must remove or rewrite one of these paths;  path one: [data], path two: [data, highScore]
в этом есть смысл, за исключением того, что теперь это не работает в любом случае.
Полные версии:
СТАРЫЙ: com.amazonaws:aws-java-sdk-dynamodb:1.11.954

Код: Выделить всё

com.amazonaws.services.dynamodbv2.document.spec.UpdateItemSpec
НОВИНКА: Software.amazon.awssdk:dynamodb:2.38.2 UpdateItemRequest

Код: Выделить всё

software.amazon.awssdk.services.dynamodb.model.UpdateItemRequest
Обновление:

При воспроизведении из командной строки это работает для обновления, но не работает для вставки

Код: Выделить всё

aws dynamodb update-item \
--region us-east-1 --table-name cosmo-local-ExperienceRecord \
--key '{"expid":{"S":"dan.test.temp"},"id":{"S":"TEST0|swid"}}' \
--update-expression 'set #key1 = :val1, #key2 = if_not_exists(#key2, :zero) + :one, #data.#totalScore = :data_totalScore, #data.#fastestTime = :data_fastestTime, #data.#highScore = :data_highScore, #key3 = :val3, #key4 = :val4, #key5 = :val5, #key7 = :val7' \
--expression-attribute-values '{":zero":{"N":"0"},":one":{"N":"1"},":val1": {"S":"2025-11-17T02:22:22"},":data_totalScore":{"N":"444"},":data_fastestTime":{"N":"44"},":data_highScore":{"N":"442"},":val3": {"S":"dan.test.temp"},":val4": {"S":"swid"},":val5": {"S":"TEST0"},":val7":{"N":"1791929176"}}' \
--expression-attribute-names '{"#key1":"timestamp","#key2":"totalWrites","#data":"data","#totalScore":"totalScore","#fastestTime":"fastestTime","#highScore":"highScore","#key3":"experienceId","#key4":"guestIdType","#key5":"guestId","#key7":"expiry"}'

An error occurred (ValidationException) when calling the UpdateItem operation: The document path provided in the update expression is invalid for update
Я могу сделать вставку таким образом, если попытаюсь создать пустую карту

Код: Выделить всё

aws dynamodb update-item \
--region us-east-1 --table-name cosmo-local-ExperienceRecord \
--key '{"expid":{"S":"dan.test.temp"},"id":{"S":"TEST1|swid"}}' \
--update-expression 'set #key1 = :val1, #key2 = if_not_exists(#key2, :zero) + :one, #data = if_not_exists(#data, :emptyMap), #key3 = :val3, #key4 = :val4, #key5 = :val5, #key7 = :val7' \
--expression-attribute-values '{":zero":{"N":"0"},":one":{"N":"1"},":val1": {"S":"2025-11-17T04:44:44.444Z"},":emptyMap":{"M":{}},":val3": {"S":"dan.test.temp"},":val4": {"S":"swid"},":val5": {"S":"TEST1"},":val7":{"N":"1799990001"}}' \
--expression-attribute-names '{"#key1":"timestamp","#key2":"totalWrites","#data":"data","#key3":"experienceId","#key4":"guestIdType","#key5":"guestId","#key7":"expiry"}'
но попытка сделать и то, и другое дает результат

Код: Выделить всё

aws dynamodb update-item \
--region us-east-1 --table-name cosmo-local-ExperienceRecord \
--key '{"expid":{"S":"dan.test.temp"},"id":{"S":"TEST2|swid"}}' \
--update-expression 'set #key1 = :val1, #key2 = if_not_exists(#key2, :zero) + :one, #data = if_not_exists(#data, :emptyMap), #data.#totalScore = :data_totalScore, #data.#fastestTime = :data_fastestTime, #data.#highScore = :data_highScore, #key3 = :val3, #key4 = :val4, #key5 = :val5, #key7 = :val7' \
--expression-attribute-values '{":zero":{"N":"0"},":one":{"N":"1"},":val1": {"S":"2025-11-17T04:44:44.444Z"},":emptyMap":{"M":{}},":data_totalScore":{"N":"444"},":data_fastestTime":{"N":"44"},":data_highScore":{"N":"441"},":val3": {"S":"dan.test.temp"},":val4": {"S":"swid"},":val5":  {"S":"TEST2"},":val7":{"N":"1799990001"}}' \
--expression-attribute-names '{"#key1":"timestamp","#key2":"totalWrites","#data":"data","#totalScore":"totalScore","#fastestTime":"fastestTime","#highScore":"highScore","#key3":"experienceId","#key4":"guestIdType","#key5":"guestId","#key7":"expiry"}'

An error occurred (ValidationException) when calling the UpdateItem operation: Invalid UpdateExpression: Two document paths overlap with each other; must remove or rewrite one of these paths; path one: [data], path two: [experienceId]
Точный текст этой ошибки немного сбивает с толку. В предыдущих тестах я видел первый путь: [data], второй путь: [data, highScore], что имеет немного больше смысла, поскольку они, по крайней мере, перекрываются.
Обновление 2:

Покопавшись в старом коде, я действительно нашел отдельный вызов updateItem, который не был портирован разработчиком, сделавшим первоначальный порт. Тайна раскрыта! (я думаю)

Подробнее здесь: https://stackoverflow.com/questions/798 ... m-v1-to-v2
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»