2017-08-17 50 views
0

我有一個表產品,其關鍵是範圍:orgzviceid + productid。它有一個名爲「結賬」地圖屬性,並稱爲「prod_stk_qty_i_i」數量將存儲屬性。假設檢驗ID是5,並且檢驗了產品ID 34中的2個數量,則對於具有產品ID 34的產品,總可用數量是10.一旦推車檢驗發生,假設檢驗ID是5,產品(爲的productid 34) 「結賬」 映射項和 「prod_stk_qty_i_i」 在DynamoDB會是這樣的:DynamoDB如何更新地圖,如果屬性存在,否則默默忽略

"checkout" : { "5" : 2 }, 
"prod_stk_qty_i_i" : 8 

如果另一個結賬發生同樣的產品(比如1個數量),並且如果該結賬ID是7,那麼n如此的結帳:

"checkout" : { "5" : 2, "7" : 1 }, 
"prod_stk_qty_i_i" : 7 

如果付款,結帳條目被刪除,數量增加。

現在,我的要求是定期在超時(30分鐘)之後,發佈已簽出但未發佈的產品數量。我通過

  • 做到這一點通過增加數量「結賬」的價值
  • 取出結賬。 map條目

即使多次嘗試此操作(冪等),此操作也不會失敗,這一點很重要,所以它必須只在checkout.checkoutID字段存在時更新。如果不是,它應該簡單地忽略。

我試過如下:

[ 
    "UpdateItem", 
    [ 
    { 
     "TableName": "Products", 
     "Key": { 
     "orgzviceid": { 
      "N": "3000161710" 
     }, 
     "productid": { 
      "N": "11" 
     } 
     }, 
     "UpdateExpression": "REMOVE #checkout.#checkoutID SET #prod_stk_qty_i_i = #prod_stk_qty_i_i + #checkout.#checkoutID", 
     "ExpressionAttributeNames": { 
     "#checkout": "checkout", 
     "#checkoutID": "235", 
     "#prod_stk_qty_i_i": "prod_stk_qty_i_i" 
     }, 
     "ConditionExpression": "attribute_exists(#checkout.#checkoutID)", 
     "ReturnValues": "ALL_NEW" 
    } 
    ] 
] 

但是,它給了我萬一結賬條目中找不到用於結帳ID 235.注意,我已經寫ConditionExpression做更新只有當錯誤屬性「condition.235」存在。

錯誤日誌:

com.amazonaws.dynamodb.v20120810#ConditionalCheckFailedException」, 「消息」: 「其 條件請求失敗...」

所以,我怎樣寫一個查詢,如果映射條目存在,那麼執行上述操作,其他方式不會失敗? 很明顯,一個不好的辦法是首先檢查一個GetItem查詢,如果檢查條目存在提供的CheckoutID,然後只做這個但是,它似乎並不正確

回答

0

我相信你錯誤地使用條件表達式。如果某些標準未得到滿足,條件的一點就是失敗。爲什麼你有條件呢?沒有條件,它只會執行更新表達式,如果該項不存在,我不會指望你得到一個錯誤。就像查詢不存在的項目一樣。你應該簡單地得到一個空集。不是一個錯誤。

+0

如果我的要求是做一個「更新IF條件」? – Ouroboros

+0

條件表達式的要點是對操作強加一個條件。這可能是失敗/斷言用戶想要的任何東西。 – Rahul

0

您的方法不起作用,因爲您在條件表達式中混合了「Attribute」和「AttributeValue」。讓我來解釋:

"ConditionExpression": "attribute_exists(#checkout.#checkoutID)" 

在你的桌子,結賬是發電機dB的屬性,而checkoutID絕不相關的表模式。因此對於發電機數據庫,checkoutID是屬性值的一部分,而不是屬性本身。

因此,有條件,你做不會工作。 您的用例的條件表達式將表示屬性檢出存在,它的值是。但是,爲了做到這一點,您需要傳遞預計的地圖,這可以歸結爲在更新之前讀取記錄。

我確實認爲閱讀記錄,更新值並堅​​持它應該是在這種情況下繼續前進的方式(並不一定是個壞主意) 在這種情況下,考慮使用某種樂觀鎖防止髒讀取和寫入。

相關問題