DynamoDB:仅当项目已存在时才更新项目

默认情况下,如果具有指定索引的对象不存在,DynamoDB 将创建一个新条目。有没有办法阻止这种情况发生?我可以在更新之前在表中查询密钥,但是在一个请求中完成所有操作会很好。


答案 1

使用条件表达式,其中 是属性名称(在本例中为主键名称)和值(要更新的项的键)。id = :idid:id

条件表达式始终在写入之前进行计算。如果该表达式的计算结果不为 (如果该键不存在或不同,则不会计算),则不会更新或放置新项。true


答案 2

关键点是,根据您正在执行的操作,在不同的数据集上进行审查 PutItemUpdateItemConditionExpression

PutItem.

设置 DynamoDB 时,将检查任何键行的条件 - 如果在表上使用范围属性,则检查行数,如果仅对表使用哈希,则仅检查 1 行 -ConditionExpression

请记住,DynamoDB PutItem 操作必须检查您传递的密钥是否已存在,因此在此处检查您的条件不会产生额外费用。

例如,如果您有一个具有customer_id/contact_email键定义的CUSTOMER_CONTACTS表,并且不想创建重复项,则可以设置 。在这种情况下,如果对指定的哈希值使用相同的电子邮件(范围属性),则 PutItem 操作将失败,条件检查失败。ConditionExpression = "#contact_email <> :email"

但不要指望检查远离哈希行的项目属性。DynamoDB 扫描所有表只是为了检查您的状况是没有意义的。

更新项目。

如果尝试与上一示例相同的条件,则操作始终会覆盖而不会触发异常。为什么?因为 UpdateItem 只查看 1 个项目,即由您的 Key 指定的项目。ConditionExpression = "#contact_email <> :email"

使用 UpdateItem 时,条件表达式将仅查看 1 行,即由必须设置的键值指定的行。无法在任何其他表行上检查您的状况。


推荐