ValidationException:table 没有指定的索引:GameTitleIndex
ValidationException: The table does not have the specified index: 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
根据文档,这就是我获取数据所需要做的全部工作。查询这个索引有什么我遗漏的吗?
任何答案将不胜感激。
提前致谢。
如果有人遇到同样的问题,答案如下:
在模型中创建新索引(本地二级索引或全局二级索引)后,迁移次数为 运行。只有在那之后 table 才会有指定的索引。有关更多说明,请参阅 this issue。
– 如果您使用带有 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 数据库文件,请执行以下操作:
- 通过指定 DynamoDB 数据库的路径更新
serverless.yml
,如下所示:
custom:
dynamodb:
stages:
- ${self:provider.stage}
start:
port: 8000
inMemory: true
migrate: true
dbPath: "./.db" # Make sure that folder exists!
- 现在您可以转到文件夹
./.db
并删除文件 shared-local-instance.db
(这是一个模仿 DynamoDB 的 SQLite 数据库 :0)。
作为下一次使用命令 serverless offline start
启动的结果,将创建 最新 本地 DynamoDB 数据库文件。
我正在使用 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
根据文档,这就是我获取数据所需要做的全部工作。查询这个索引有什么我遗漏的吗? 任何答案将不胜感激。 提前致谢。
如果有人遇到同样的问题,答案如下: 在模型中创建新索引(本地二级索引或全局二级索引)后,迁移次数为 运行。只有在那之后 table 才会有指定的索引。有关更多说明,请参阅 this issue。
– 如果您使用带有 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 数据库的路径更新
serverless.yml
,如下所示:
custom:
dynamodb:
stages:
- ${self:provider.stage}
start:
port: 8000
inMemory: true
migrate: true
dbPath: "./.db" # Make sure that folder exists!
- 现在您可以转到文件夹
./.db
并删除文件shared-local-instance.db
(这是一个模仿 DynamoDB 的 SQLite 数据库 :0)。
作为下一次使用命令 serverless offline start
启动的结果,将创建 最新 本地 DynamoDB 数据库文件。