2016-10-21 70 views
2

僅當新項目的日期比現有項目更新時,我纔想更新DynamoDB中的項目。目前,我正在查詢現有項目,在我的代碼中進行比較,然後寫入數據庫。我想知道是否有方法讓DynamoDB爲我執行檢查。我研究過使用Expected,但它的比較操作符需要接受一個參數,該參數違背了目的,因爲它意味着無論如何都必須查詢現有項目。只有在新屬性大於現有項目的情況下,DynamoDb纔會更新項目

我與Java 8

回答

4

ConditionExpression工作可以用來檢查條件,如果滿足條件,更新的項目。這與SQL語句中的WHERE條件類似。差異是: -

1)DynamoDB需要使用分區鍵和範圍鍵來更新項目。非關鍵屬性條件可以在ConditionExpression中給出

2)DynamoDB一次只能更新一個項目。

ConditionExpression - (String)必須滿足 條件才能使條件更新成功的條件。

預期 - (地圖)這是一個遺留參數,用於向後兼容 。相反,新應用程序應該使用ConditionExpression 。不要在 單個API調用中合併傳統參數和表達式參數;否則,DynamoDB將返回一個 ValidationException異常。

示例代碼: -

下面的代碼更新僅在現有值「CREATEDATE」屬性小於新值的項目(即換句話說,新的值比現有值桌子)。

UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey("yearkey", yearKey, "title", title) 
     .withReturnValues(ReturnValue.UPDATED_NEW).withUpdateExpression("set #createdate = :val1") 
     .withNameMap(new NameMap().with("#createdate", "createdate")) 
     .withValueMap(new ValueMap().withString(":val1", createDate)) 
     .withConditionExpression("createdate < :val1"); 

UpdateItemOutcome outcome = null; 
try { 
    outcome = table.updateItem(updateItemSpec); 
} catch (ConditionalCheckFailedException ce) { 
    System.out.println("Conditional check failed." + ce.getMessage()); 
    return false; 
} 

return true; 
+0

啊,謝謝!我無法讓代碼失敗,但事實證明,問題在於我以錯誤的格式傳遞日期。爲了記錄,我將'new DateTime(createDate).toString()'傳遞給值映射。 – alexgbelov

相關問題