amazon-web-services - UpdateExpression 增加列表中嵌套映射的值
问题描述
我有以下表结构:
{myHashKey: x, someList: [{info: uniqueID, myAttribute: number, ...}, ...]}
number
对于给定的info
子属性,我想增加, 。即,假设我在 dynamodb 中插入了以下项目:
{myHashKey: 'xxxx', someList: [{info: 'a', myAttribute: 1}, {info: 'b', myAttribute: 42}]}
我必须执行什么 UpdateExpression 才能更新项目以将给定信息的 myAttribute 增加给定的数字,比如我想将1
info的 myAttributea
增加到5
,即从上面得到:
{myHashKey: 'xxxx', someList: [{info: 'a', myAttribute: 5}, {info: 'b', myAttribute: 42}]}
?
我阅读了一堆文档和其他 stackoverflow 帖子,但仍然无法实现。
解决方案
您无法有效地将列表中的项目作为目标进行更新。我认为您的表结构不可能。我前段时间遇到了同样的问题,但我没有找到解决方案。我改变了可能的表结构。
我猜你的桌子不是为你想做的事情而设计的。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();
});
}
推荐阅读
- firebase - firebase 托管多个站点配置 .firebaserc 文件
- qt - 如何在没有固定大小的布局中省略文本项?
- server - HTTP 状态 500 - 内部服务器错误 RapidClipse
- python - Django为不同的用户添加多个数据库名称
- java - 在 Java 中将 BigDecimal 字段作为 JSON 字符串值返回
- reactjs - TypeError:无法读取未定义的 React Native Redux 的属性“地图”
- azure - 使用 VSTS 和 Azure 时正确管理应用程序设置
- mysql - DB2 到 SQL 的迁移
- php - 使用多个收件人时,根据 Laravel 电子邮件的收件人不同的视图数据
- android - 在android listview中设置项目的背景颜色