我有一个dynamoDB条目,其中每个项目都有一个rating
属性。我正在使用原子表达式使用以下表达式来递增值:
UpdateExpression: 'set info.rating = info.rating + :val',
有没有一种方法可以限制最大额定值而无需读取,对照现有值检查当前值,然后仅在不超过我设置的限制时才写入?
理想的情况如下:
UpdateExpression: 'if (!(info.rating + :val)) set info.rating = info.rating + :val',
谢谢
答案 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'
如果再次失败,则可以环回并重试第一个操作,因为某些操作会降低这些操作之间的值。
但是,如果您的用例希望增量经常达到上限,,您可能会发现仅执行读写操作会更便宜,因为它比两次写入便宜得多。您仍然应该使用条件表达式来确保写入次数不超过上限。