Почему этот условный PutItem Dynamodb не работает? - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь использовать PutItem для выполнения условной записи данных в Dynamodb, если данные в определенном поле отсутствуют или данные соответствуют известной строке.

Я пытаюсь реализовать операцию счетчика atomi c в Dynamodb, так как существует небольшая вероятность того, что запись может быть изменена другим процессом. Данные считываются из DDB, часть записи изменяется, а затем предпринимается попытка записи, и я хочу, чтобы запись была успешной только в том случае, если данные в точке записи совпадают с исходным значением, считанным из базы данных ( или если изначально не было данных).

PutItemRequest request = PutItemRequest.builder()
                               .tableName(DDB_TABLE_NAME)
                               .item(itemValues)
                               .conditionExpression("attribute_not_exists(#DATA) OR #DATA = :oldEnvReleaseStatus")
                               .expressionAttributeNames(Map.of("#DATA", DATA))
                               .expressionAttributeValues(Map.of(
                                       ":oldEnvReleaseStatus",
                                       AttributeValue.builder()
                                                     .s(objectMapper.writeValueAsString(oldEnvReleaseStatus))
                                                     .build()))
                               .build();

Значения, которые меня интересуют, это JSON строки:

Old env release status that we will overwrite: {"status":"INITIATED","instanceReleaseStatusesByInstanceRelease":{"monolith":{"status":"INITIATED","releasedAt":"2020-05-26T20:52:18.794032Z"}},"releasedAt":"2020-05-26T20:52:18.793910Z"}

Attempting to overwrite env release status with {"status":"RELEASE_IN_PROGRESS","instanceReleaseStatusesByInstanceRelease":{"monolith":{"status":"INITIATED","releasedAt":"2020-05-26T20:52:18.794032Z"}},"releasedAt":"2020-05-26T20:52:18.793910Z"}

Данные в DATA поле в базе данных выглядит так, когда я просматриваю в Dynamodb (DDB экранирует кавычки в GUI):

data String:    {\"status\":\"INITIATED\",\"instanceReleaseStatusesByInstanceRelease\":{\"monolith\":{\"status\":\"INITIATED\",\"releasedAt\":\"2020-05-26T20:52:18.794032Z\"}},\"releasedAt\":\"2020-05-26T20:52:18.793910Z\"}

Значение в поле данных в DDB кажется таким же, как используемое при условии (т.е. данные не изменились, и поэтому я думаю, что запись должна быть завершена с go), но при попытке записи я получаю ConditionalCheckFailedException. Что я делаю не так?

...