我有一個表產品,其關鍵是範圍: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,然後只做這個但是,它似乎並不正確
如果我的要求是做一個「更新IF條件」? – Ouroboros
條件表達式的要點是對操作強加一個條件。這可能是失敗/斷言用戶想要的任何東西。 – Rahul