使用node.js更新expression式上的发电机数据库错误

我需要更新我的aws-dynamo数据库上的列表。 我用分区键创build了一个表:email。 然后iam成功地将一些电子邮件ID插入到表中。 现在我的桌子是这样的

电子邮件

manaf1@gmail.com

manaf2@gmail.com

manaf3@gmail.com

然后,我试图用新的关键“细节”更新表,它的值是一个列表。 这是我的代码

var AWS = require("aws-sdk"); var params = { TableName: "manaftable1", Key: { email: "manaf1@gmail.com" }, UpdateExpression: "set #details = list_append (#details, :detailsinput)", ExpressionAttributeNames: { "#details": "details" }, ExpressionAttributeValues: { ":detailsinput":{ "id": "1","mob": "978956" } } }; var docClient = new AWS.DynamoDB.DocumentClient(); docClient.update(params, function (err, data) { if (err) console.log(JSON.stringify(err, null, 2)); else console.log(JSON.stringify(data, null, 2)); }); 

但是我得到这样的错误

 { "message": "Invalid UpdateExpression: Incorrect operand type for operator or function; operator or function: list_append, operand type: M", "code": "ValidationException", "time": "2016-10-26T11:04:60.756", "requestId": "SN0NPRHDFHUKBBJHOVI0DFHHRQNSO5AEMVJFFGHF9ASFHUAAJG", "statusCode": 400, "retryable": false, "retryDelay": 0 } 

我需要更新后这样的回应

第一栏:电子邮件

第2栏:细节

manaf1@gmail.com | [{ “ID”: “1”, “怪物”: “978956”},{ “ID”: “2”, “怪物”: “767886”}]

manaf2@gmail.com |

与我的代码有关的问题是什么?

当detail属性存在于该项目中时,更新expression式应该只是没有list_append的SET

 UpdateExpression : "SET #details = :details" 

如果项目中存在 details属性,并且新更新需要在列表中添加其他元素,则可以使用list_append将新元素添加到列表中。

 UpdateExpression : "set #details = list_append (#details, :details)" 

作为list_append AWS文档说 :

新元素必须包含在列表中,例如,将2添加到列表中,操作数将是[2]

所以你需要附加一个对象数组,而不仅仅是一个对象:

 var params = { TableName: "manaftable1", Key: { email: "manaf1@gmail.com" }, UpdateExpression: "set #details = list_append (#details, :detailsinput)", ExpressionAttributeNames: { "#details": "details" }, ExpressionAttributeValues: { ":detailsinput": [{ "id": "1","mob": "978956" }] } }; 

如果该属性不存在于对象中,则可以使用if_not_exists操作数:

 var params = { TableName: "manaftable1", Key: { email: "manaf1@gmail.com" }, UpdateExpression: "set if_not_exists(#details, []) set #details = list_append (#details, :detailsinput)", ExpressionAttributeNames: { "#details": "details" }, ExpressionAttributeValues: { ":detailsinput": [{ "id": "1","mob": "978956" }] } }; 

使用list_append()if_not_exists()一起追加到可能不存在的列表列:

 var params = { TableName: "manaftable1", Key: { email: "manaf1@gmail.com" }, UpdateExpression: "set #details = list_append(if_not_exists(#details, :empty_list), :detailsinput)", ExpressionAttributeNames: { "#details": "details" }, ExpressionAttributeValues: { ":detailsinput": [{ "id": "1","mob": "978956" }], ":empty_list": [] } };