ValidationException: таблица не имеет указанного индекса: GameTitleIndex

Я использую Vogels, средство отображения данных DynamoDB для NodeJS. Я запрашиваю глобальный индекс согласно документации Vogels. Все, что я сделал, это создал модель с таким глобальным вторичным индексом:

let MyModel = vogels.define('MyModel', {
  hashKey: 'uuid',
  timestamps: true,
  updatedAt: 'updated_at',
  createdAt: 'created_at',
  schema: MyModelBaseSchema,
  indexes : [{ 
    hashKey : 'gameTitle', rangeKey : 'topScore', name : 'GameTitleIndex', type : 'global'
  }]
});

и запрос по этому индексу

MyModel.query('game 1')
  .usingIndex('GameTitleIndex')
  .loadAll()
  .select("COUNT");

При запуске любых тестов показывает исключение ValidationException: The table does not have the specified index: GameTitleIndex

Согласно документации, это все, что мне нужно сделать, чтобы получить данные. Есть ли что-нибудь, что я пропустил при запросе этого индекса? Любые ответы будут оценены. Заранее спасибо.

2 ответа

Решение

Если кто-то застрял на той же проблеме, вот ответ: после создания нового индекса в модели, либо локального вторичного индекса, либо глобального вторичного индекса, необходимо запустить миграцию. Только после этого таблица будет иметь указанный индекс. Обратитесь к этому вопросу для получения дополнительных разъяснений.

- Если вы используете Serverless framework с плагинами serverless-Dynamodb-local и serverless-offline (для локального тестирования).

- И если вы создали новый локальный вторичный индекс, но команда, показанная ниже, все еще не показывает его подLocalSecondaryIndexes узел конфигурации:

aws dynamodb describe-table --table-name YOUT_TABLE_NAME --endpoint-url http://localhost:8000

- И если вы получаете ошибку ValidationException: The table does not have the specified index: YOUR_INDEX_NAME при использовании кода, подобного показанному ниже:

  query(uid, id) {
    const params = {
      TableName: YOUR_TABLE_NAME,
      IndexName: YOUR_LSI_NAME,
      KeyConditionExpression: "#uid = :uid and #id = :id",
      ExpressionAttributeNames: {
        "#uid": "uid",
        "#id": "id",
      },
      ExpressionAttributeValues: { ":uid": uid, ":id": id },
    };
    return DB.query(params).promise();
  }

Тогда, скорее всего, вам нужно удалить локальный файл базы данных DynamoDB и перезапустить службы сserverless offline startкоманда. Это заставит воссоздать локальный файл базы данных DynamoDB с соответствующими локальными вторичными индексами.


Чтобы удалить локальный файл базы данных DynamoDB, выполните следующие действия:

  1. Обновите serverless.yml указав путь к базе данных DynamoDB, как показано ниже:
custom:
  dynamodb:
    stages:
      - ${self:provider.stage}
    start:
      port: 8000
      inMemory: true
      migrate: true
      dbPath: "./.db" # Make sure that folder exists!
  1. Теперь вы можете перейти в папку ./.db и удалить файл shared-local-instance.db (это база данных SQLite, имитирующая DynamoDB:0).

В результате при следующем запуске с командой serverless offline startдо даты файла базы данных локального DynamoDB будет создана.

Другие вопросы по тегам