使用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": [] } };
- Node JS和AWS sdk – 具有多个Expected值的putitem不起作用
- node.js AWS dynamodb updateItem
- Nodejs错误:读取ECONNRESET
- 是否有一个好的对象映射器可以在nodejs中使用的Amazons dynamodb(通过aws sdk)?
- 你如何unit testing一个NodeJs的Lambda函数写入/读取dynamodb,并通过AWS API网关端点调用?
- DynamoDB,使用AWS Lambda(NodeJS运行时)映射值的dynamicprimefaces更新
- 如何在Amazon Dynamodb中使用聚合函数
- 来自Node-aws的Dynamo Local:所有操作都失败“无法对不存在的表执行操作”
- DynamoDB应用程序体系结构