【问题标题】:dynamodb updateItem set an attribute to an objectdynamodb updateItem 为对象设置属性
【发布时间】:2015-12-02 08:05:45
【问题描述】:

我有一个表,它的属性实际上是一个 JSON 列表。

var myItem = {
    name: 'myname',
    tasks: [
       { key1: 'value1', key2: 'value2' }
    ]
}

我像这样将 myItem 放入表中,这似乎工作正常。

var params = {
    TableName: 'runs',
    Item: myItem
};
dynamodbDoc.put( params, ...

然后我想更新记录以更改“任务”。

var newTasks = [
   { key1: 'newvalue1', key2: 'newvalue2' }
]

所以我设置了这样的 updateItem:

var params = {
    TableName: 'runs',
    Key: {
        name: { S: 'myname' }
    },
    UpdateExpression: "SET #tasks = :tasks",
    ExpressionAttributeNames: {
        "#tasks": "tasks"
    },
    ExpressionAttributeValues: {
        ":tasks": newTasks
    },
    ReturnValues: 'ALL_NEW'
}

dynamodb.updateItem( params, ...

给我UnexpectedParameter: Unexpected key '0' found in params.ExpressionAttributeValues[':tasks'] 失败了。

我也试过了

ExpressionAttributeValues: {
    ":tasks": { M: tasks }
},

还有……

ExpressionAttributeValues: {
    ":tasks": { L: tasks }
},

这些也不起作用。显然我在这里遗漏了一些东西。

【问题讨论】:

  • 你在使用 javascript sdk 吗?
  • @zsimpson 检查this。我需要更新数组中的特定 JSON。很像你的东西。我找不到合适的资源来做到这一点。

标签: amazon-dynamodb


【解决方案1】:

如果您使用的是低级 api 调用,那么您需要将数据完全序列化为正确的 dynamodb 属性值,包括嵌套在列表中的值。

ExpressionAttributeValues: {
  ":tasks": {L:[ 
                {M : {key1 : {S : "newvalue1"}, 
                      key2 : {S : "newvalue2"} 
                }
            ]}
}

正如您可以想象的那样,手动序列化这些数据会非常累人,我建议您考虑使用一个高级包装器,它会自动为您执行序列化。

【讨论】:

  • 非常感谢您提供的线索!问题是我把不同的接口弄混了。当我切换到使用高级 DocumentClient API update() 函数而不是低级 dynamoDB updateItem() 时,一切都开始按预期工作。
  • @ryan 检查this。我需要更新数组中的特定 JSON。很像你的东西。我找不到合适的资源来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多