DynamoDB ConditionalExpression无法识别属性名称或值

时间:2016-01-14 15:19:41

标签: node.js amazon-dynamodb aws-sdk

我正在使用NodeJS的aws-sdk并尝试进行更新,以便如果该项目不存在则会引发错误。我使用Expression API而不是遗留API。这是我不为我工作的人为例子。

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中提供的值:keys:{#idKey}

我尝试过使用属性名称并将实际值插入表达式的各种其他ConditionalExpressions。我开始认为这是一个错误。使用遗留的AttributeUpdate的遗留预期 - >存在,但我无法使用表达式演示此功能。

1 个答案:

答案 0 :(得分:1)

您已经使用UpdateItemRequest的Key参数缩小到_id = 10的特定项目。如果某个项不存在,则无法对某个键的特定值调用UpdateItem调用。因此,只需要ConditionExpression中的attribute_exists(#idKey)

以下代码引出了您想要的行为(我必须将表名更改为Images,将主键更改为Id以匹配DynamoDB Local 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
});

提醒一下,请不要在此发布任何真实的密码数据:)