Обновление DynamoDb завершается неудачно с ошибкой «Выражение обновления попыталось обновить ключ вторичного индекса до неподдерживаемого типа» - PullRequest
0 голосов
/ 20 сентября 2019

Я запускаю простое обновление, чтобы добавить UUID в массив.Сбой с сообщением об ошибке «В выражении обновления предпринята попытка обновить вторичный индексный ключ до неподдерживаемого типа».Но поля, которые я обновляю, не являются ключами в каких-либо вторичных индексах.

Вот код обновления:

const params = {
    "TableName": "churches",
    "Key": {
        "churchId": "0194fb2a-9a0f-4b6a-b347-7adffbaed8ff",
        "countryId": "UK"
    },
    "ReturnValues": "ALL_NEW",
    "UpdateExpression": "set #team = list_append(if_not_exists(#team, :empty_list), :user)",
    "ExpressionAttributeNames": {
        "#team": "team"
    },
    "ExpressionAttributeValues": {
        ":empty_list": [],
        ":user": [
            "b23fe6cf-83e9-417c-b987-e8e645a29bcd"
        ]
    }
}
db.update(params,(err,data) => {
  if(err) console.log('ERROR:',err);
  if(data) console.log('DATA:',data);
})

Ключ раздела - churchId, а countryId - ключ сортировки.

А вот вывод:

ERROR: { ValidationException: The update expression attempted to update the secondary index key to unsupported type
    at Request.extractError (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/protocol/json.js:51:27)
    at Request.callListeners (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
    at Request.emit (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/sequential_executor.js:78:10)
    at Request.emit (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/request.js:683:14)
    at Request.transition (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/request.js:685:12)
    at Request.callListeners (/Users/richbee/Library/Mobile Documents/com~apple~CloudDocs/code/ec-api/dbcodetest/node_modules/aws-sdk/lib/sequential_executor.js:116:18)
  message:
   'The update expression attempted to update the secondary index key to unsupported type',
  code: 'ValidationException',
  time: 2019-09-20T16:51:08.712Z,
  requestId: 'IF0CSPBPQLHBAHOBK299V9KGMVVV4KQNSO5AEMVJF66Q9ASUAAJG',
  statusCode: 400,
  retryable: false,
  retryDelay: 4.443976966236384 }

Это вторичные индексы, сконфигурированные в таблице: снимок экрана вторичных индексов

До сих пор я задавал себе следующие вопросы:

  • Обновляю ли я поле, которое вторичный индекс использует в качестве ключа?- Нет, единственное поле, которое я обновляю, это «команда», то есть список.
  • Я устанавливаю какие-либо значения полей для чего-либо, что JS может интерпретировать как что-либо, кроме строки?- Нет, это UUID

Что мне не хватает?!

1 Ответ

0 голосов
/ 23 сентября 2019

Это не проблема с опубликованным кодом, но с базовой базой данных.

Один из моих индексов ожидал строку для своего ключа, но у ряда существующих записей в базе данных было поле заполнителяустановить на ноль (я знал, что собираюсь добавить этот ключ, как только он у меня будет, и DynamoDB не любит пустые строки, поэтому я установил их на нуль).

Кажется, что это создаетНарушение индексации, которое приводит к сбою всех последующих записей в эту запись до тех пор, пока она не будет разрешена:

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.OnlineOps.ViolationDetection.html

Исправление состоит в том, чтобы либо полностью удалить этот ключ,или поместите в него фактическую строку, а не оставляйте ее плавающей как ноль.

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