DynamoDB GSI未按预期索引条目问题求助
问题分析与解决方案
你的核心问题源于对DynamoDB GSI(全局二级索引)规则的误解:当GSI定义了排序键时,只有主表中同时包含GSI分区键和排序键的条目,才会被自动投影到GSI中。你当前的GSI配置指定了GSI1SK作为排序键,因此只有带有该属性的主表条目才会出现在GSI里,这是DynamoDB的默认行为,并非代码错误。
针对你的需求(以主表SK为GSI分区键,GSI1SK作为可选排序键),提供两种解决方案:
方案一:移除GSI排序键(适用于所有带SK的条目都需进入GSI的场景)
如果希望所有主表条目(均包含SK)都被纳入GSI,无论是否有GSI1SK,只需删除GSI配置中的排序键定义。此时GSI仅以SK为分区键,所有主表条目都会被投影到GSI中;后续若部分条目添加了GSI1SK,这些条目会在GSI中自动按该字段排序。
修改后的代码:
this.leaderboardsTable.addGlobalSecondaryIndex({ indexName: 'GSI1', partitionKey: { name: 'SK', type: dynamodb.AttributeType.STRING }, projectionType: dynamodb.ProjectionType.INCLUDE, nonKeyAttributes: ['participant_display_name'] })
方案二:为无GSI1SK的条目设置默认值(适用于必须保留GSI排序键的场景)
若你确实需要GSI保留排序键,但希望无GSI1SK的条目也能进入GSI,可以在写入主表数据时,为这类条目设置一个默认的GSI1SK值(比如空字符串""或固定占位符"NO_SORT_KEY")。这样所有条目同时具备GSI的分区键(SK)和排序键(GSI1SK),都会被纳入GSI。
另外你提到的“GSI条目PK和SK与主表一致”是正常现象:DynamoDB会自动将主表的主键(PK、SK)投影到GSI中,无论你设置的投影类型是什么。GSI的索引逻辑是按自身的分区键(SK)和排序键(GSI1SK)来组织数据的,你通过GSI查询时,指定SK作为分区键,即可按预期获取排序后的结果。
内容的提问来源于stack exchange,提问作者user22265191
相关产品推荐
相关产品推荐

