使用DynamoDBMapper查询GSI时typos字段数据缺失问题
问题原因与解决方案
这问题我之前也碰到过,核心原因出在全局二级索引(GSI)的投影设置上。
DynamoDB的GSI默认采用KEYS_ONLY投影模式——也就是说,这个索引里只存储GSI自身的主键属性,以及原表的主键属性,其他非主键属性不会被自动投影到GSI中。当你通过GSI查询时,DynamoDB只会返回GSI里存在的属性数据;对于没被投影的属性(比如你的salutations里的typos,甚至整个salutations字段),DynamoDBMapper只能拿到空值,因为索引里根本没有这些数据。而你用主哈希键查询时,是直接查原表,自然能获取所有完整数据。
解决步骤
1. 修改GSI的投影模式
你需要把customer_id_bis-index的投影模式改成以下两种之一:
- ALL:投影原表的所有属性到GSI中(简单直接,但如果表属性很多会增加存储成本)
- INCLUDE:只投影你需要的指定属性(更高效,推荐),这里你需要包含
salutations字段
操作方式(举几个常见例子):
AWS控制台:
- 打开DynamoDB控制台,找到
customer_table - 进入「索引」标签页,找到
customer_id_bis-index - 点击「编辑」,修改投影模式为「全部」或者选择「包含」并添加
salutations字段 - 保存修改,等待GSI重建完成(状态变为「ACTIVE」)
- 打开DynamoDB控制台,找到
AWS CLI命令:
aws dynamodb update-table \ --table-name customer_table \ --global-secondary-index-updates '[ { "Update": { "IndexName": "customer_id_bis-index", "Projection": { "ProjectionType": "INCLUDE", "NonKeyAttributes": ["salutations"] } } } ]'
2. 验证修改生效
等GSI状态变成ACTIVE后,再运行你的GSI查询代码,就能正常获取typos数组的数据了。
额外注意点
- GSI重建需要时间,具体时长取决于你的表数据量,期间查询可能还是返回旧结果
- 如果你的
salutations字段后续有结构变更,只要投影模式是ALL或包含该字段,GSI会自动同步,不用额外操作 - 尽量避免用ALL投影如果表的非主键属性很多,会增加GSI的存储和写入开销,按需选择INCLUDE更划算
内容的提问来源于stack exchange,提问作者Antoine MAITRE
相关产品推荐
相关产品推荐

