Amazon dynamodb dynamodb updateItem为对象设置属性

Amazon dynamodb dynamodb updateItem为对象设置属性,amazon-dynamodb,Amazon Dynamodb,我有一个表,它有一个属性,实际上是一个JSON列表 var myItem = { name: 'myname', tasks: [ { key1: 'value1', key2: 'value2' } ] } 我像这样把我的物品放在桌子上,这似乎很好用 var params = { TableName: 'runs', Item: myItem }; dynamodbDoc.put( params, ... 然后我想更新记录以更改“任务”

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

var myItem = {
    name: 'myname',
    tasks: [
       { key1: 'value1', key2: 'value2' }
    ]
}
我像这样把我的物品放在桌子上,这似乎很好用

var params = {
    TableName: 'runs',
    Item: myItem
};
dynamodbDoc.put( params, ...
然后我想更新记录以更改“任务”

因此,我设置了如下更新项:

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

dynamodb.updateItem( params, ...
此操作失败,原因是提供了
意外参数:在params.ExpressionAttributeValues[':tasks']
中找到了意外的键“0”

我也试过了

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

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

这些也不起作用。显然,我在这里遗漏了一些内容。

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

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

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

您使用的是javascript sdk吗?@zsimpson check。我需要更新数组中的特定JSON。有点像你的。我找不到合适的资源来做这件事。非常感谢你的提示!问题是我把不同的接口搞混了。当我切换到使用高级DocumentClient API update()函数而不是低级dynamoDB updateItem()函数时,所有这些都开始按预期工作。@ryan check。我需要更新数组中的特定JSON。有点像你的。我找不到合适的资源来做那件事。
ExpressionAttributeValues: {
  ":tasks": {L:[ 
                {M : {key1 : {S : "newvalue1"}, 
                      key2 : {S : "newvalue2"} 
                }
            ]}
}