Amazon dynamodb 尝试在dynamo db中运行updateitem时遇到问题

Amazon dynamodb 尝试在dynamo db中运行updateitem时遇到问题,amazon-dynamodb,Amazon Dynamodb,我能够从dynamo db获取记录并成功查看响应。我需要修改“项”“数组”中获取的“ACCOUNTNAME”属性,更新json,并在dynamo db中更新。现在,当我尝试更新获取的记录时,我最终遇到了无效的属性值类型异常 for (let key in usersOfAccountFromDB.body.Items) { var updateParam = { TableName: process.env.AWS_DYNAMO_TABLE, Key: { UU

我能够从dynamo db获取记录并成功查看响应。我需要修改“项”数组”中获取的“ACCOUNTNAME”属性,更新json,并在dynamo db中更新。现在,当我尝试更新获取的记录时,我最终遇到了无效的属性值类型异常

for (let key in usersOfAccountFromDB.body.Items) {

  var updateParam = {
    TableName: process.env.AWS_DYNAMO_TABLE,
    Key: {
      UUID: usersOfAccountFromDB.body.Items[key].UUID,      
      TYPE: user 
    },     
    UpdateExpression: "SET #ACCOUNTNAME = :val1",
    ExpressionAttributeNames: {
        '#ACCOUNTNAME': 'ACCOUNTNAME'   
    },
    ExpressionAttributeValues: {
        ":val1": newAccountName
    },
    ReturnValues: "UPDATED_NEW",
  };

  const result = await this.getDocClient().update(updateParam).promise();                   
}
我尝试使用代码片段提供的带字符串数组的键来更新它,也尝试使用单个字符串更新for循环内部,但都失败了,与

  "statusCode": 400,
  "body": {
    "message": "Invalid attribute value type",
    "error": {
      "errorMessage": "ValidationException"
    }
  }
for (let key in usersOfAccountFromDB.body.Items) {

  var updateParam = {
    TableName: process.env.AWS_DYNAMO_TABLE,
    Key: {
      UUID: usersOfAccountFromDB.body.Items[key].UUID,      
      TYPE: user 
    },     
    UpdateExpression: "SET #ACCOUNTNAME = :val1",
    ExpressionAttributeNames: {
        '#ACCOUNTNAME': 'ACCOUNTNAME'   
    },
    ExpressionAttributeValues: {
        ":val1": newAccountName
    },
    ReturnValues: "UPDATED_NEW",
  };

  const result = await this.getDocClient().update(updateParam).promise();                   
}
我试图通过如下设置键来创建参数并更新for循环中的调用

      Key: {
       "UUID": {
            "S": usersOfAccountFromDB.body.Items[key].UUID
        }
        ,
       "TYPE": {
            "S": user
        }  
      }
    var userUUIDArray : string[] = [];
    for (let key in usersOfAccountFromDB.body.Items) {
      userUUIDArray.push(usersOfAccountFromDB.body.Items[key].UUID);
    }

    for (var uuid of userUUIDArray) {
    console.log("UUID : " +uuid);     // prints all the uuid
    }

    // Creating a parameter for the update dynamo db
    var params = {
    TableName: <tableName>,
    Key: {
      "UUID": {
            "SS": userUUIDArray
        }
        ,
      "TYPE": {
            "S": user
        }  
    },               
    UpdateExpression: 'SET #ACCOUNTNAME = :val1',
    ExpressionAttributeNames: {
        '#ACCOUNTNAME': 'ACCOUNTNAME'       //COLUMN NAME   
    },
    ExpressionAttributeValues: {
      ':val1': newAccountName  
    },
    ReturnValues: 'UPDATED_NEW',
    };

    //call the update of dynamodb
    const result = await this.getDocClient().update(param).promise();
    "body": {
    "message": "Invalid attribute value type",
    "error": {
      "errorMessage": "ValidationException"
      }
    }
for (let key in usersOfAccountFromDB.body.Items) {

  var updateParam = {
    TableName: process.env.AWS_DYNAMO_TABLE,
    Key: {
      UUID: usersOfAccountFromDB.body.Items[key].UUID,      
      TYPE: user 
    },     
    UpdateExpression: "SET #ACCOUNTNAME = :val1",
    ExpressionAttributeNames: {
        '#ACCOUNTNAME': 'ACCOUNTNAME'   
    },
    ExpressionAttributeValues: {
        ":val1": newAccountName
    },
    ReturnValues: "UPDATED_NEW",
  };

  const result = await this.getDocClient().update(updateParam).promise();                   
}
但也以同样的例外失败了

for (let key in usersOfAccountFromDB.body.Items) {

  var updateParam = {
    TableName: process.env.AWS_DYNAMO_TABLE,
    Key: {
      UUID: usersOfAccountFromDB.body.Items[key].UUID,      
      TYPE: user 
    },     
    UpdateExpression: "SET #ACCOUNTNAME = :val1",
    ExpressionAttributeNames: {
        '#ACCOUNTNAME': 'ACCOUNTNAME'   
    },
    ExpressionAttributeValues: {
        ":val1": newAccountName
    },
    ReturnValues: "UPDATED_NEW",
  };

  const result = await this.getDocClient().update(updateParam).promise();                   
}
从dynamo db获取Json

[
  {
    "DEFINITION": "914ba44a-8c26-4b60-af0f-96b6aa37efe6",
    "UUID": "830a49cb-4ed3-41ae-b111-56714a71ab98",
    "TYPE": "USER",
    "RELATION": "01efd131-6a5d-4068-889e-9dba44262da5",
    "ACCOUNTNAME": "Wolff LLC"
  },
  {
    "DEFINITION": "1f60fded-323d-40e1-a7f8-e2d053b0bed0",
    "UUID": "47db3bbe-53ac-4e58-a378-f42331141997",
    "TYPE": "USER",
    "RELATION": "01efd131-6a5d-4068-889e-9dba44262da5",
    "ACCOUNTNAME": "Wolff LLC"
  },
  {
    "DEFINITION": "05ddccba-2b6d-46bd-9db4-7b897ebe16ca",
    "UUID": "e7290457-db77-48fc-bd1a-7056bfce8fab",
    "TYPE": "USER",
    "RELATION": "01efd131-6a5d-4068-889e-9dba44262da5",
    "ACCOUNTNAME": "Wolff LLC"
  },
.
.
.
.]
for (let key in usersOfAccountFromDB.body.Items) {

  var updateParam = {
    TableName: process.env.AWS_DYNAMO_TABLE,
    Key: {
      UUID: usersOfAccountFromDB.body.Items[key].UUID,      
      TYPE: user 
    },     
    UpdateExpression: "SET #ACCOUNTNAME = :val1",
    ExpressionAttributeNames: {
        '#ACCOUNTNAME': 'ACCOUNTNAME'   
    },
    ExpressionAttributeValues: {
        ":val1": newAccountName
    },
    ReturnValues: "UPDATED_NEW",
  };

  const result = await this.getDocClient().update(updateParam).promise();                   
}
现在,我尝试迭代Json和设置UUID,UUID是字符串数组的键,如下所示

      Key: {
       "UUID": {
            "S": usersOfAccountFromDB.body.Items[key].UUID
        }
        ,
       "TYPE": {
            "S": user
        }  
      }
    var userUUIDArray : string[] = [];
    for (let key in usersOfAccountFromDB.body.Items) {
      userUUIDArray.push(usersOfAccountFromDB.body.Items[key].UUID);
    }

    for (var uuid of userUUIDArray) {
    console.log("UUID : " +uuid);     // prints all the uuid
    }

    // Creating a parameter for the update dynamo db
    var params = {
    TableName: <tableName>,
    Key: {
      "UUID": {
            "SS": userUUIDArray
        }
        ,
      "TYPE": {
            "S": user
        }  
    },               
    UpdateExpression: 'SET #ACCOUNTNAME = :val1',
    ExpressionAttributeNames: {
        '#ACCOUNTNAME': 'ACCOUNTNAME'       //COLUMN NAME   
    },
    ExpressionAttributeValues: {
      ':val1': newAccountName  
    },
    ReturnValues: 'UPDATED_NEW',
    };

    //call the update of dynamodb
    const result = await this.getDocClient().update(param).promise();
    "body": {
    "message": "Invalid attribute value type",
    "error": {
      "errorMessage": "ValidationException"
      }
    }
for (let key in usersOfAccountFromDB.body.Items) {

  var updateParam = {
    TableName: process.env.AWS_DYNAMO_TABLE,
    Key: {
      UUID: usersOfAccountFromDB.body.Items[key].UUID,      
      TYPE: user 
    },     
    UpdateExpression: "SET #ACCOUNTNAME = :val1",
    ExpressionAttributeNames: {
        '#ACCOUNTNAME': 'ACCOUNTNAME'   
    },
    ExpressionAttributeValues: {
        ":val1": newAccountName
    },
    ReturnValues: "UPDATED_NEW",
  };

  const result = await this.getDocClient().update(updateParam).promise();                   
}

所有方法都失败了,但上述异常相同

代码当前使用的
更新操作只允许更新单个项目

for (let key in usersOfAccountFromDB.body.Items) {

  var updateParam = {
    TableName: process.env.AWS_DYNAMO_TABLE,
    Key: {
      UUID: usersOfAccountFromDB.body.Items[key].UUID,      
      TYPE: user 
    },     
    UpdateExpression: "SET #ACCOUNTNAME = :val1",
    ExpressionAttributeNames: {
        '#ACCOUNTNAME': 'ACCOUNTNAME'   
    },
    ExpressionAttributeValues: {
        ":val1": newAccountName
    },
    ReturnValues: "UPDATED_NEW",
  };

  const result = await this.getDocClient().update(updateParam).promise();                   
}
IIUC,您想用一个API调用更新多个项。为此,您需要使用操作。请记住,每次调用更新的项目不能超过25个

for (let key in usersOfAccountFromDB.body.Items) {

  var updateParam = {
    TableName: process.env.AWS_DYNAMO_TABLE,
    Key: {
      UUID: usersOfAccountFromDB.body.Items[key].UUID,      
      TYPE: user 
    },     
    UpdateExpression: "SET #ACCOUNTNAME = :val1",
    ExpressionAttributeNames: {
        '#ACCOUNTNAME': 'ACCOUNTNAME'   
    },
    ExpressionAttributeValues: {
        ":val1": newAccountName
    },
    ReturnValues: "UPDATED_NEW",
  };

  const result = await this.getDocClient().update(updateParam).promise();                   
}
您得到的错误的来源
由于在
UUID
字段中使用了
“SS”
,您的代码失败。此字段为字符串类型,因此必须使用
“S”
。但是请注意,由于您使用的是文档客户端API,因此不需要使用此符号传递值。有关更多详细信息,请参阅。

我现在已通过使用循环逐个运行update语句解决了此问题

for (let key in usersOfAccountFromDB.body.Items) {

  var updateParam = {
    TableName: process.env.AWS_DYNAMO_TABLE,
    Key: {
      UUID: usersOfAccountFromDB.body.Items[key].UUID,      
      TYPE: user 
    },     
    UpdateExpression: "SET #ACCOUNTNAME = :val1",
    ExpressionAttributeNames: {
        '#ACCOUNTNAME': 'ACCOUNTNAME'   
    },
    ExpressionAttributeValues: {
        ":val1": newAccountName
    },
    ReturnValues: "UPDATED_NEW",
  };

  const result = await this.getDocClient().update(updateParam).promise();                   
}

谢谢你的意见。我试图硬编码值,而不是字符串数组到字符串,但仍然面临类似的问题键:{UUID:{S:{830a49cb-4ed3-41ae-b111-56714a71ab98},键入:{S:“用户”}``新帐户名的值是多少?
?这是一个需要更新为dynamo db属性名'ACCOUNTNAME'的值,我理解。它的价值是什么?是号码吗?一根绳子?还有别的吗?