【问题标题】:dynamo db error on update expression using node.js使用 node.js 更新表达式的 dynamo db 错误
【发布时间】:2016-10-26 11:34:37
【问题描述】:

我需要更新我的 aws-dynamo 数据库中的列表。我创建了一个带有分区键的表:电子邮件。然后我成功地将一些电子邮件 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
}

更新后我需要这样的回应

第 1 列:电子邮件

第 2 列:详细信息

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

manaf2@gmail.com |

我的代码有什么问题?

【问题讨论】:

  • 您是否在架构中定义了details?或者,您可以从 DDB 获取项目,更新它,然后使用 put 在 DDB 中更新它
  • 我只在架构中定义关键电子邮件。

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


【解决方案1】:

作为list_append says 的 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" }]
        }
    };

【讨论】:

  • 会报错 { "message": "提供的表达式引用了item中不存在的属性", "code": "ValidationException", "time": "2016-10 -26T16:28:41.626Z", "requestId": "CAMLAN7JKISU9C7NSTKUPMHCDJVV4KQNSO5AEMVJF66Q9ASUAAJG", "statusCode": 400, "retryable": false, "retryDelay": 0 }
【解决方案2】:

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": []
  }
};

【讨论】:

    【解决方案3】:

    details 属性出现在项目中时,更新表达式应该只有SET 而没有list_append。

    UpdateExpression : "SET #details = :details"
    

    details属性在item中存在并且新的更新需要在列表中添加额外的元素,那么list_append可以用来将新元素添加到列表中。

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

    【讨论】:

      猜你喜欢
      • 2020-10-13
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      相关资源
      最近更新 更多