2016-01-14 67 views
3

我正在使用NodeJS的aws-sdk,並且正在嘗試進行更新,以便如果該項目不存在,則會引發錯誤。我正在使用Expression API而不是傳統的API。這是我設計的例子,不適合我。DynamoDB條件表達式不識別屬性名稱或值

client.update({ 
    TableName: 'User', 
    Key: {'_id': '10'}, 
    UpdateExpression: 'SET username = :user, password = :pword', 
    ConditionalExpression: 'attribute_exists(#idKey) AND #idKey = :idVal', 
    ExpressionAttributeNames: { 
     '#idKey': '_id' 
    }, 
    ExpressionAttributeValues: { 
     ':idVal': '10', 
     ':user': 'user10', 
     ':pword': 'password10' 
    }}, function(err, data){ 
     if(err) console.log(err); 
     else console.log(data); 
}); 

ValidationException:鍵::在ExpressionAttributeNames在表達式未使用提供價值{#idKey}

我試圖使用兩個屬性名稱以及將所述實際值到表達各種其他ConditionalExpressions。我開始認爲這是一個錯誤。使用傳統的Expected-> Exists與傳統的AttributeUpdate一起工作,但我無法用Expressions演示此功能。

+0

我意識到這是一個古老的問題,但你有沒有找到答案?我正在經歷完全相同的情況。 – Stanley

+0

沒有解決它。由於不相關的原因,我最終轉向了另一個數據庫,但我希望再次使用它來獲得新的保護。我有點失望,這個問題仍然懸而未決。如果我可以在我的新項目上解決它,我會發布更新。 – Nikordaris

+0

我發佈了一個類似的問題,並得到了一個解決方案。請參閱http://stackoverflow.com/questions/41873769/dynamodb-how-to-prevent-creating-a-new-item-in-updateitem-if-the-item-does-not/41874889?noredirect=1#comment70932075_41874889 – Stanley

回答

1

您已經縮小到具有UpdateItemRequest的Key參數的_id = 10的特定項目。如果一個項目不存在,你不能在一個特定的鍵值上調用UpdateItem調用。因此,ConditionExpression中只有attribute_exists(#idKey)是必需的。

下面的代碼引起你想要的行爲(我不得不改變表名的圖像和主鍵標識匹配DynamoDB本地shell教程的內容。

var params = { 
    TableName: 'Image', 
    Key: { // The primary key of the item (a map of attribute name to AttributeValue) 
     '_id': 'dynamodb.png' 
    }, 
    UpdateExpression: 'SET username = :user, password = :pword', 
    ConditionExpression: 'attribute_exists(#id)', 
    ExpressionAttributeValues: { 
     ':user': 'user10', 
     ':pword': 'password10' 
    }, 
    ExpressionAttributeNames: { 
     '#id': '_id' 
    }, 
    ReturnValues: 'ALL_NEW' 
}; 
docClient.update(params, function(err, data) { 
    if (err) ppJson(err); // an error occurred 
    else ppJson(data); // successful response 
}); 

提醒您,請不要不要在這裏發佈任何真實的密碼數據:)

+0

感謝您的回答。我的目的是防止一個新實體被創建,如果它不存在的話。 ConditionExpression是不是attribute_exists()?此外,由於我原來的錯誤是與ExpressionAttributeNames這個答案應該使用它以及以證明它適用於原始場景。我認爲我的最終問題是ConditionExpression的錯誤,但我還沒有確認它。 – Nikordaris

+0

你是對的,我會更新我的答案。我也將添加expr attr名稱。如果有效,請立即投票! –

+0

我更新了我的答案 –

相關問題