Возникла проблема при попытке запустить updateitem в Dynamo DB - PullRequest
0 голосов
/ 20 октября 2019

Я могу извлечь запись из динамо-базы данных и успешно просмотреть ответ. Мне нужно изменить извлеченный атрибут ' ACCOUNTNAME ' в ' items ' массив и обновить 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"
      }
    }

Все сбой подходов с одинаковым выше исключением

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Я решил проблему, выполнив оператор обновления один за другим с помощью цикла

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();                   
}
0 голосов
/ 21 октября 2019

Операция update, используемая в настоящее время вашим кодом, позволяет обновлять только один элемент.

IIUC, вы хотите обновить несколько элементов одним вызовом API. Для этого вам необходимо использовать операцию batchWrite. Помните, что вы не можете обновить более 25 элементов за один вызов.

Источник получаемой вами ошибки

Ваш код не работает из-за использования "SS" в UUIDполе. Это поле имеет тип string, поэтому вы должны использовать "S". Тем не менее, обратите внимание, что, поскольку вы используете клиентский API документа, вам не нужно передавать значения, используя эту нотацию. См. этот ответ для получения более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...