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