【问题标题】:How can I create or update a map using update expression?如何使用更新表达式创建或更新地图?
【发布时间】:2018-07-09 07:28:49
【问题描述】:

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

我在拆分这两个操作时遇到了问题,所以我现在尝试在单个命令中使用 UpdateItem 来完成这两个操作。

我尝试了 3 种不同的方法都不起作用,它们有下面列出的不同错误,问题似乎是创建地图并尝试在单个命令中更新它 - 我的更新参数应该是什么样的?

尝试一:

 {
    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 中创建或更新(增加)地图时,什么语法是正确的?

谢谢

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:

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

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

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

    【讨论】:

    • 我之前尝试过这种方法,但发现在最初的 CreateItem 之后,更多的 GetItems 直到很久以后才返回新项目,这就是为什么我正在寻找一种可以同时进行的方法.
    • 这表明您的表配置不足并且您的请求受到限制。您是否尝试增加 WCU 和 RCU?
    • 如果您阅读了this answer about throttling,希望对您有所帮助。
    • 如果您正在编写仅配置 1 个 WCU 和 1 个 RCU 的大型项目,this answer 可能是相关的。
    • @Stu 比赛条件怎么样?如果每秒更新太多,它将覆盖更新的值或使用乐观锁抛出异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    相关资源
    最近更新 更多