首页 > 解决方案 > UpdateExpression 增加列表中嵌套映射的值

问题描述

我有以下表结构:

{myHashKey: x, someList: [{info: uniqueID, myAttribute: number, ...}, ...]}

number对于给定的info子属性,我想增加, 。即,假设我在 dynamodb 中插入了以下项目:

{myHashKey: 'xxxx', someList: [{info: 'a', myAttribute: 1}, {info: 'b', myAttribute: 42}]}

我必须执行什么 UpdateExpression 才能更新项目以将给定信息的 myAttribute 增加给定的数字,比如我想将1info的 myAttributea增加到5,即从上面得到:

{myHashKey: 'xxxx', someList: [{info: 'a', myAttribute: 5}, {info: 'b', myAttribute: 42}]}

?

我阅读了一堆文档和其他 stackoverflow 帖子,但仍然无法实现。

标签: amazon-web-servicesnosqlamazon-dynamodb

解决方案


您无法有效地将列表中的项目作为目标进行更新。我认为您的表结构不可能。我前段时间遇到了同样的问题,但我没有找到解决方案。我改变了可能的表结构。

我猜你的桌子不是为你想做的事情而设计的。DynamoDB 是一个列数据库,利用它。

表建议:

  • Hash: myHashKey// 和现在一样
  • 范围:info 其他字段myAttribute

当你知道myHashKey并且info你可以很容易地找到和更新。

var docClient = new AWS.DynamoDB.DocumentClient();

function async increment(myHashKeyValue, infoValue, value = 1) {

    var params = {
        TableName:table,
        Key:{
            "myHashKey": myHashKeyValue,
            "info": infoValue,
        },
        UpdateExpression: "set #myAttribute = #myAttribute + :val",
        ExpressionAttributeValues:{
            ":val": value,
        },
        ExpressionAttributeNames:{
            '#myAttribute': 'myAttribute',
        },
        ReturnValues:"UPDATED_NEW"
    };

    await docClient.update(params).promise();
});

}


推荐阅读