2016-07-23 47 views
4

默認情況下,如果具有指定索引的對象不存在,DynamoDB將創建一個新條目。有沒有辦法阻止這種情況發生?我可以在更新之前查詢該表的密鑰,但在一次請求中完成所有操作將很不錯。DynamoDB:僅當它存在時才更新的項目

+0

你可以用條件表達式來做到這一點。文檔在這裏http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions。html –

回答

0

您可能在尋找attribute_not_exists簽入Condition Expressions

將此條件表達式與PutItem一起使用時,DynamoDB將首先查找主鍵與要寫入項目相匹配的項目。只有當搜索沒有返回時,結果中才存在分區鍵。否則,attribute_not_exists函數上述失敗,則寫在http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html防止

更多

+1

它從文檔中看到'attribute_not_exists'檢查一行是否有一個特定的屬性,而不是如果存在一個具有該關鍵字的行。是這樣嗎?並且我不想使用'attribute_exists',因爲如果其中一個已經存在,我希望它更新該行,並且如果沒有找到,則不執行任何操作? – Bananable

+1

你說得對,我試着用'attribute_exists',它絕對不會阻止插入一個項目,因爲它只檢查一行是否有某個屬性。你有沒有找到解決方案? – jurer

0

使用條件表達式id = :id其中id是屬性名稱(或在您的情況下的主鍵名稱),並:id是值(鍵您要更新的項目)。

條件表達式總是在任何寫入之前進行評估。如果該表達式不計算爲true(如果該關鍵字不存在或不同),該表達式不會更新或放入新項目。

1

關鍵是ConditionExpression根據您正在執行的操作在不同的數據集上進行審查PutItemUpdateItem

PutItem。

當設置ConditionExpression DynamoDB將檢查您在任何Key行上的條件 - 如果在表上使用range屬性,則爲多行,如果僅爲表使用散列,則爲1。

記住DynamoDB PutItem操作必須檢查您傳遞的密鑰是否已經存在,因此在此檢查您的條件時不需要額外的成本。

例如,如果您的customer_id/contact_email鍵定義了CUSTOMER_CONTACTS表,並且不想創建重複項,則可以設置ConditionExpression = "#contact_email <> :email"。在這種情況下,如果對指定的散列值使用相同的電子郵件(範圍屬性),則PutItem操作將失敗,並出現ConditionalCheckFailedException。

但不要指望檢查遠離哈希行的項目屬性。沒有意義讓DynamoDB掃描所有表格來檢查您的狀況。

更新項目。

如果嘗試的條件與前面的示例ConditionExpression = "#contact_email <> :email"相同,則操作始終覆蓋而不會觸發異常。爲什麼?因爲UpdateItem只是查看1個項目,即您的Key指定的項目。

使用UpdateItem時,ConditionExpression只會查看1行,即您必須設置的Key值所指定的行。沒有辦法檢查你的任何其他錶行的條件。

相關問題