2017-08-13 10 views
0

我有DynamoDB,並且想要嘗試更新某些條目並插入不存在的條目。我當前的代碼是這樣的:如果不存在,DynamoDB-Java將寫入更新

updateItemSpec = new UpdateItemSpec() 
       .withPrimaryKey(ITable.ID, 
       request.getID().getValue()) 
       .withUpdateExpression(updatedExpressionSetString) 
       .withNameMap(nameMap) 
       .withValueMap(valueMap) 
try { 
     table.updateItem(updateItemSpec); 
} 

凡updateExpression是:直到到達那裏的主鍵不存在一個條目

SET supply.#var0 = 
if_not_exists(supply.#var0,:default) + :val0, 
date = :dateVal 

這一切的偉大工程。發生這種情況時該代碼拋出異常:

在更新表達式提供的文件路徑是更新無效(服務:AmazonDynamoDBv2;狀態代碼:400;錯誤代碼:ValidationException;)

我的問題是:如何我是否需要更正此代碼,以便它在到達主鍵時插入,當它到達已存在的主鍵時進行更新,而不需要額外的讀取以檢查它是否存在?

+0

你有沒有試圖用沒有主鍵的表來運行這個? – efekctive

+0

那麼表是空的默認情況下,但我仍然需要保持主鍵否則我得到一個_cannot有空的關鍵GetItem,DeleteItem,或UpdateItem error_ – MatthewO

+0

我的意思是嘗試隔離問題。嘗試一個簡單的更新,如果它的工作,那麼你知道問題是如果存在。我現在無法訪問我的Java環境 – efekctive

回答

0

我記不得PK是強制性的。它是。從Java文檔:

if_not_exists(路徑,操作數) - 如果該項目不在指定的路徑包含一個 屬性,則if_not_exists計算結果爲 操作數;否則,它評估路徑。避免覆蓋可能已經存在於 項目中的屬性,您可以使用此功能 。

但這

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.UpdateData.html

狀態是可能的。

該值似乎不是PK。 upsert是否在沒有表達式的情況下在桌面上工作?

相關問題