我有一个具有属性的表,实际上是一个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 }
},
这些也不起作用。显然我在这里遗漏了一些东西。
答案 0 :(得分:2)
如果您正在使用低级api调用,则需要将数据完全序列化为正确的dynamodb属性值,包括嵌套在列表中的值。
ExpressionAttributeValues: {
":tasks": {L:[
{M : {key1 : {S : "newvalue1"},
key2 : {S : "newvalue2"}
}
]}
}
你可以想象手工序列化这些数据可能会非常快,我建议使用一个高级包装器来自动为你执行序列化。