如何使用更新表达式创建或更新地图?

时间:2018-01-30 11:59:33

标签: amazon-web-services amazon-dynamodb

我有一个场景,我想创建一个项目,如果它不存在,或者更新一个项目 - 增加一个项目,如果它已经存在。

我遇到了分裂这两个操作的问题,所以我现在尝试在一个命令中使用UpdateItem进行这两个操作。

我尝试了3种不同的方法,但是下面列出了不同的错误,看起来问题就是创建地图并尝试在一个命令中更新它 - 我的更新参数应该是什么样的? / p>

尝试一个:

 {
    TableName: TableName,
    Key: {
        'key': key
    },
    UpdateExpression: `
        ADD #total :change
        ,   mapname.#type.#total :one
    `,
    ExpressionAttributeValues: {
        ':change': change,
        ':one': 1
    },
    ExpressionAttributeNames: {
        '#type': 'dynamicstring',
        '#total': 'total'
    }
};

错误为:ValidationException: The document path provided in the update expression is invalid for update

尝试二:

{
    TableName: TableName,
    Key: {
        "key": key
    },
    UpdateExpression: `
        SET custommap = if_not_exists(custommap, :emptyMap)
        SET #total = #total + :change, 
        custommap.#type.#total = custommap.#type.#total + :one
    `,
    ExpressionAttributeValues: {
        ':change': change,
        ':one': 1,
        ':emptyMap': {
            'M': {
                'dynamicstring': {
                    'M': {
                        'total': {
                            'N': 0
                        }
                    }
                }
            }
        }
    },
    ExpressionAttributeNames: {
        '#type': 'dynamicstring',
        '#total': 'total'
    }
}

错误为:ValidationException: Invalid UpdateExpression: The "SET" section can only be used once in an update expression;

因此,当我使用UpdateItem在Item中创建或更新(增加)一个地图时,哪种语法是正确的?

由于

1 个答案:

答案 0 :(得分:0)

SET只会阻止你覆盖一个属性,而不是一个项目。

他们实现这一目标的方法是:

  1. 使用您的密钥使用GetItem查看该项目是否已存在
  2. 如果该项存在,则执行UpdateItem并递增计数器
  3. 如果该项目不存在,则使用PutItem