僅當新項目的日期比現有項目更新時,我纔想更新DynamoDB中的項目。目前,我正在查詢現有項目,在我的代碼中進行比較,然後寫入數據庫。我想知道是否有方法讓DynamoDB爲我執行檢查。我研究過使用Expected,但它的比較操作符需要接受一個參數,該參數違背了目的,因爲它意味着無論如何都必須查詢現有項目。只有在新屬性大於現有項目的情況下,DynamoDb纔會更新項目
我與Java 8
僅當新項目的日期比現有項目更新時,我纔想更新DynamoDB中的項目。目前,我正在查詢現有項目,在我的代碼中進行比較,然後寫入數據庫。我想知道是否有方法讓DynamoDB爲我執行檢查。我研究過使用Expected,但它的比較操作符需要接受一個參數,該參數違背了目的,因爲它意味着無論如何都必須查詢現有項目。只有在新屬性大於現有項目的情況下,DynamoDb纔會更新項目
我與Java 8
的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;
啊,謝謝!我無法讓代碼失敗,但事實證明,問題在於我以錯誤的格式傳遞日期。爲了記錄,我將'new DateTime(createDate).toString()'傳遞給值映射。 – alexgbelov