Как использовать UpdateItem для изменения числовых значений - PullRequest
1 голос
/ 07 октября 2019

В моей базе данных есть элемент (type: 'TOTAL'), который сообщает мне, сколько существует элементов определенного типа (type: 'CONFIG'). Когда я удаляю элемент CONFIG, я хочу уменьшить число, сохраненное в TOTAL. TOTAL не обязательно существует, поэтому я хочу установить его в 0, если он не существует, или вычесть 1 из его текущего значения, если он существует.

if total exists
  total = total - 1
else 
  new total = 0

Я использую UpdateItem, потому что у меня нет никакой информации о элементе TOTAL до выполнения этого запроса. Если я использую ADD и TOTAL еще не существует, он установит значение в 0, а затем вычтет 1 вместо того, чтобы просто установить его в 0, как я хочу. Я попытался использовать SET с if_not_exists вместо этого, но он не будет принимать операнд в случае, если элемент существует, то есть когда я хочу, чтобы он вычел 1.

Вот мой текущий запрос, которыйзапускается, когда я вызываю функцию для удаления элемента CONFIG:

aws dynamodb update-item \
  --table-name application \
  --key '{"type":{"S":"TOTAL"},"id":{"S":"CONFIG"}}' \
  --update-expression "SET TotalConfigs = if_not_exists(TotalConfigs-1,:z)" \
  --expression-attribute-values '{":z":{"N":"0"}}'

Я получаю ошибку

An error occurred (ValidationException) when calling the UpdateItem operation:
Invalid UpdateExpression: Syntax error; token: "-", near: "TotalConfigs-1"

Меня это не удивляет, поскольку я понимаю, что этоне работаетЕсть ли способ сделать то, что я хочу, без использования нескольких запросов?

1 Ответ

1 голос
/ 07 октября 2019

Самый безопасный и эффективный подход - использовать транзакции . У вас будет транзакция с двумя операциями, одна будет PUT с новым элементом, а другая - ОБНОВЛЕНИЕМ, использующим Атомные счетчики для total

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...