node.js - 使用 Node.js 更新表达式时出现 dynamo 数据库错误

标签 node.js amazon-web-services amazon-dynamodb nosql

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

电子邮件

manaf1@gmail.com

manaf2@gmail.com

manaf3@gmail.com

然后,我尝试使用新键“details”更新表,其值是一个列表。这是我的代码

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
}

更新后我需要这样的回复

第 1 列:电子邮件

第2列:详细信息

manaf1@gmail.com | [{"id":"1","mob":"978956"},{"id":"2","mob":"767886"}]

manaf2@gmail.com |

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

最佳答案

作为 list_append says 的 AWS 文档:

The new element must be contained in a list, for example to add 2 to a list, the operand would be [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" }]
        }
    };

关于node.js - 使用 Node.js 更新表达式时出现 dynamo 数据库错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40261236/

相关文章:

python - 仅更新给定的值并忽略 dynamodb 中的其他值

node.js - gulp-sass 不再有默认的 Sass 编译器

ruby - eu-central-1(法兰克福)AWS 身份验证失败

javascript - 字符串数组架构的 DynamoDB 数组

amazon-web-services - 允许 ICMP 后无法 ping AWS RDS 实例

amazon-web-services - 当 ec2 实例终止时创建电子邮件通知。电子邮件应包含实例详细信息。例如 :Instance Name

amazon-web-services - 如何格式化通过 Kinesis Streams for DynamoDB 触发的 Lambda 函数的过滤条件?

amazon-web-services - 如何使用 Cloud Formation 模板自动扩展 DynamoDB?

node.js - Backbone.js 和 Node.js 有什么区别?哪个最好?

javascript - 在其他地方初始化 ('mymodule' 后调用 require 'mymodule' ) 是否正确?