使用dynamodb-data-mapper-js查询GSI遇ValidationException报错求助
问题原因与解决方案
核心问题
你用错了方法:dynamodb-data-mapper-js的get方法仅支持通过表的主键(这里是id)查询单条数据,无法直接使用全局二级索引(GSI)的键进行查询。
日志里显示Key: {},是因为get方法只会识别被@hashKey/@rangeKey标记的字段,你传入的code只是普通属性(即使配置了GSI关联),所以mapper无法生成合法的主键查询条件,导致报错。
解决方案
要通过GSI查询数据,需使用query方法,并指定要使用的GSI名称。
1. 修改查询代码
替换原有的get调用为query:
import { QueryExpression } from '@aws/dynamodb-data-mapper'; // 构建查询表达式,指定要使用的GSI和查询条件 const queryExpr = new QueryExpression({ indexName: 'code-index', keyCondition: { code: 'code_456' } }); // 执行查询,获取所有符合条件的结果 const results: Item[] = []; for await (const item of dataMapper.query(Item, queryExpr)) { results.push(item); } // 若确定该code对应唯一数据,可直接取第一个结果 const targetItem = results[0];
2. 验证Item类配置
你的Item类中code字段的GSI配置是正确的,无需修改:
@attribute({ indexKeyConfigurations: { 'code-index': 'HASH' }, type: 'String', }) code: string;
该配置告诉mappercode是code-index这个GSI的哈希键,配合query方法可以正确识别查询条件。
关键说明
get方法:仅用于通过表的主键(id)获取唯一记录,不支持GSI查询。query方法:用于查询表或GSI的主键(哈希键+可选范围键),是GSI查询的正确方式。- 若你的GSI哈希键(
code)可能对应多条数据,需遍历处理查询结果;若需保证唯一性,需在业务层做约束(DynamoDB GSI本身不强制唯一)。
内容的提问来源于stack exchange,提问作者AngularDebutant
相关产品推荐
相关产品推荐

