DynamoDB查询报错缺失provinceId,咨询仅按countryId查询数据的方法
问题原因及解决方法
为什么报错?
DynamoDB的Query操作要求必须指定分区键(HASH键),你的表中provinceId是分区键,countryId是排序键。排序键仅能配合分区键使用,用来筛选同一分区内的数据,单独用排序键无法定位到具体分区,因此触发错误Query condition missed key schema element: provinceId。
解决方案
方案1:创建全局二级索引(推荐)
通过给countryId创建全局二级索引(GSI),让它成为索引的分区键,这样就能直接用Query按countryId查询数据。
步骤1:修改表定义(CloudFormation)
在原表的Properties中添加GlobalSecondaryIndexes配置:
Type: 'AWS::DynamoDB::Table' Properties: AttributeDefinitions: - AttributeName: 'provinceId' AttributeType: 'S' - AttributeName: 'countryId' AttributeType: 'S' BillingMode: PAY_PER_REQUEST TableName: 'province-country-list' PointInTimeRecoverySpecification: PointInTimeRecoveryEnabled: true Tags: - Key: 'STAGE' Value: '${self:provider.stage}' - Key: 'CostCenter' Value: !Sub '${self:provider.stage}-${AWS::AccountId}' KeySchema: - AttributeName: 'provinceId' KeyType: 'HASH' - AttributeName: 'countryId' KeyType: 'RANGE' GlobalSecondaryIndexes: - IndexName: 'countryId-index' KeySchema: - AttributeName: 'countryId' KeyType: 'HASH' Projection: ProjectionType: ALL # 若不需要全量属性,可改为INCLUDE并指定需要的字段,减少存储成本
步骤2:修改查询代码
在Query参数中指定使用这个索引:
const params = { TableName: 'province-country-list', IndexName: 'countryId-index', // 指定全局二级索引 KeyConditionExpression: 'countryId = :countryId', ExpressionAttributeValues: { ':countryId': countryId, }, }; const provincesList = await dynamoDb.query(params).promise();
方案2:使用Scan操作(不推荐)
如果临时需要查询且不想创建索引,可以用Scan配合过滤条件,但Scan会遍历整个表,数据量大时性能极差,且成本更高:
const params = { TableName: 'province-country-list', FilterExpression: 'countryId = :countryId', ExpressionAttributeValues: { ':countryId': countryId, }, }; const provincesList = await dynamoDb.scan(params).promise();
内容的提问来源于stack exchange,提问作者Debabrata Roy
相关产品推荐
相关产品推荐

