我如何向dynamodb字段添加约束?

时间:2019-06-05 01:23:39

标签: amazon-dynamodb

我有一个dynamoDB条目,其中每个项目都有一个rating属性。我正在使用原子表达式使用以下表达式来递增值:

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

有没有一种方法可以限制最大额定值而无需读取,对照现有值检查当前值,然后仅在不超过我设置的限制时才写入?

理想的情况如下:

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

谢谢

1 个答案:

答案 0 :(得分:3)

DynamoDB文档在分区和排序键之外没有固定的架构,因此无法将约束应用于字段。

不幸的是,您也无法在单个操作中执行“有上限的递增”。 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'

如果再次失败,则可以环回并重试第一个操作,因为某些操作会降低这些操作之间的值。

但是,如果您的用例希望增量经常达到上限,,您可能会发现仅执行读写操作会更便宜,因为它比两次写入便宜得多。您仍然应该使用条件表达式来确保写入次数不超过上限。