[英]DynamoDB: How to update an item except for one attribute if the attribute already exists
所以我试图将一个项目放入一个 DDB 表(nodejs)中。 如果项目具有“date_created”属性,我想更新该项目中除“date_created”之外的所有字段。
我看过条件表达式,据我所知,它是非常二元的。 如果条件 == 真则继续,如果不是,则不要。 我正在寻找的是无论如何都要进行放置,但如果存在,则不要更新“date_created”。
这可能吗? 我什至以正确的心态来解决这个问题吗?
在这种情况下,您不需要带有 ConditionExpression 的 PutItem。
您需要使用UpdateItem API。 UpdateItem 是一个“不安”,所以如果主键不存在,API 将导致插入一个新项目。 此 API 接受更新表达式,可用于设置、修改和/或从项目中删除一个或多个字段。 更新表达式有一些可用的特殊函数,为了防止覆盖现有数据,您应该使用if_not_exists(path, operand)
。 如果path
不存在,DynamoDB 会将operand
的结果放在path
。 如果path
确实存在,它将保持不变。
您案例的更新表达式如下所示:
SET if_not_exists(date_created, :right_now), other_field_1 = :value_1, other_field_2 = :value_2
我不相信 DynamoDB 本身就支持这一点。
更好的解决方案可能在初始放置时使用date_created
,在后续更新时使用date_updated
。 初始放置是某种高级“新项目”操作(如“添加员工”)的结果。 后续更新不需要是有条件的——它们不包括date_created
,只包括date_updated
。 并且您将这两个属性隐藏在模型层中(例如,实现了createRecord()
和updateRecord()
)。
或者,做一个初始的 DDB 放置,包括date_created
,条件是date_created
不存在。 如果此条件请求失败,请在没有date_created
情况下进行更新。
我同意@jarmod 的最佳方式; 但是,如果您真的想对除一个字段之外的所有字段进行更新,您可以执行update
而不是put
。 在 JavaScript 中,您甚至可以根据数据中的键生成更新语句,并排除date_created
值(如果它恰好在数据中)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.