我能够从dynamo db获取记录并成功查看响应。我需要在“ 项目” 数组中修改获取的“ ACCOUNTNAME ”属性,并更新json并在dynamo db中进行更新。现在,当我尝试更新提取的记录时,我以无效的属性值类型异常结束。
我试图使用带有字符串数组的键来更新它,该字符串随代码片段一起提供,还尝试使用单个字符串在for循环内更新,但是都失败了,但与
相同 "statusCode": 400,
"body": {
"message": "Invalid attribute value type",
"error": {
"errorMessage": "ValidationException"
}
}
我试图通过以下设置键来创建参数并更新for循环内的调用,
Key: {
"UUID": {
"S": usersOfAccountFromDB.body.Items[key].UUID
}
,
"TYPE": {
"S": user
}
}
但由于相同的例外也失败了。
从发电机数据库获取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"
},
.
.
.
.]
现在,我尝试迭代Json并设置UUID,这是字符串数组的关键,如下所示,
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"
}
}
所有方法均失败,但有相同的例外情况
答案 0 :(得分:0)
您的代码当前使用的update
操作仅允许更新一项。
IIUC,您想通过一个API调用更新多个项目。为此,您需要使用batchWrite
操作。请记住,每次调用最多只能更新25个项目。
由于在"SS"
字段中使用了UUID
,因此您的代码失败。该字段的类型为字符串,因此您必须使用"S"
。但是请注意,由于您正在使用文档客户端API,因此不需要使用该符号传递值。有关更多详细信息,请参见this answer。
答案 1 :(得分:0)
我现在通过使用循环逐个运行更新语句解决了该问题
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();
}