繁体   English   中英

DynamoDB:如果属性已存在,如何更新除一个属性之外的项目

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM