Как добавить ограничения к полям DynamodB? - PullRequest
0 голосов
/ 05 июня 2019

У меня есть запись в DynamoDB, где каждый элемент имеет свойство rating. Я увеличиваю значение, используя атомный счетчик, используя следующее выражение:

  UpdateExpression: 'set info.rating = info.rating + :val',

Есть ли способ, которым я могу ограничить максимальное значение рейтинга без необходимости читать, сравнивать текущее значение с существующим, а затем записывать только в том случае, если оно не превышает установленное мной ограничение?

Идеально было бы что-то вроде следующего:

  UpdateExpression: 'if (!(info.rating + :val)) set info.rating = info.rating + :val',

Спасибо

1 Ответ

3 голосов
/ 05 июня 2019

Документы DynamoDB не имеют фиксированной схемы за пределами ваших разделов и ключей сортировки, поэтому нет никакого способа применить ограничение к полю.

К сожалению, вы также не можете выполнить «увеличение с помощью cap» за одну операцию. Поддержка выражений обновлений DynamoDB для реальных приложений очень плохая.

Вы можете воспользоваться условными выражениями, чтобы остановить обновление, если оно превысит ограничение:

UpdateExpression: 'SET info.rating = info.rating + :val',
ConditionExpression: 'info.rating <= :maxAllowed' // Where :maxAllowed = :cap - :val

Если это приводит к ошибке условной проверки, вы знаете, что добавление к существующему значению превысит ограничение, поэтому вы можете выполнить другую операцию, чтобы попытаться установить его в ограничение:

UpdateExpression: 'SET info.rating = :cap',
ConditionExpression: 'info.rating > :maxAllowed'

Если это снова не удается, вы можете вернуться назад и повторить первую операцию, потому что что-то уменьшило значение между операциями.

Однако, если ваш сценарий использования предполагает, что приращение часто достигает предела, вам может оказаться дешевле просто выполнить чтение и запись, поскольку это значительно дешевле, чем две записи. Вы должны все еще использовать выражение условия, чтобы гарантировать, что запись не превышает ограничение.

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