簡體   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