dynamodb updateItem为对象设置属性

时间:2015-12-01 19:25:02

标签: amazon-dynamodb

我有一个具有属性的表,实际上是一个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 }
},

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

1 个答案:

答案 0 :(得分:2)

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

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

你可以想象手工序列化这些数据可能会非常快,我建议使用一个高级包装器来自动为你执行序列化。