Мы пытаемся использовать одно и то же выражение 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)
Запрос выглядит так:
Код: Выделить всё
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)
}
Если мы попытаемся создать карту, добавив
Код: Выделить всё
#data = if_not_exists(#data, :mapKey1)для итогового выражения, например
Код: Выделить всё
set #key1 = :val1, #key2 = if_not_exists(#key2, :zero) + :one, #data = if_not_exists(#data, :mapKey1), #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.services.dynamodb.model.UpdateItemRequestПри воспроизведении из командной строки это работает для обновления, но не работает для вставки
Код: Выделить всё
aws dynamodb update-item \
--region us-east-1 --table-name myTable \
--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 myTable \
--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 myTable \
--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]
Обновление 2:
Покопавшись в старом коде, я действительно нашел отдельный вызов updateItem, который не был портирован разработчиком, сделавшим первоначальный порт. Тайна раскрыта! (я думаю)
Подробнее здесь: https://stackoverflow.com/questions/798 ... m-v1-to-v2
Мобильная версия