首页 > 解决方案 > ValidationException:该表没有指定的索引:GameTitleIndex

问题描述

我正在使用 Vogels,用于 NodeJS 的 DynamoDB 数据映射器。我正在根据 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

根据文档,这就是我获取数据所要做的一切。有什么我错过了查询这个索引的吗?任何答案将不胜感激。提前致谢。

标签: node.jsamazon-dynamodbvogels

解决方案


– 如果您使用 Serverless 框架和serverless-dynamodb-local和serverless -offline插件(用于本地测试)。

– 如果您创建了新的Local Secondary Index,但下面显示的命令仍未在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命令重新启动服务。这将强制使用适当的Local Secondary Indexes重新创建本地 DynamoDB 数据库文件。


要删除本地 DynamoDB 数据库文件,请执行以下操作:

  1. 通过指定 DynamoDB 数据库的路径来更新serverless.yml,如下所示:
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(这是一个模仿 DynamoDB :0 的 SQLite 数据库)。

结果,在下次使用该命令启动时,serverless offline start将创建最新的本地 DynamoDB 数据库文件。


推荐阅读