DynamoDB GSI查询:匹配项存在却返回空结果且带LastEvaluatedKey?
问题描述
我有一张Workouts表,以及一个名为ByPlanIdIsCompletedAndCreatedBy的索引。该索引的分区键为planId,排序键是由isComplete#createdBy组合而成的字段。
为检查Workouts表中是否存在至少一项符合KeyConditionExpression的记录,我编写了以下DynamoDB查询参数,目标是最小化读取消耗且绝不进行分页:
{ TableName: 'Workouts', IndexName: 'ByPlanIdIsCompletedAndCreatedBy', KeyConditionExpression: 'planId = :planId begins_with(isComplete#createdBy, :sortKey)', ExpressionAttributeValues: { ':planId': '<some-id>', ':sortKey': 'TRUE#BBBB', }, Limit: 1 };
假设表中存在符合KeyConditionExpression要求的记录,是否会出现查询返回空结果但同时携带LastEvaluatedKey的情况?若会,原因是什么?应采取什么操作来避免分页或大幅降低分页需求?
回答
是否会出现空结果+LastEvaluatedKey的情况?
不会。
当表中明确存在符合条件的记录时,设置Limit:1的DynamoDB查询会直接返回第一条匹配的记录,不会返回空结果。而LastEvaluatedKey仅当查询结果集未完全返回(即还有更多匹配项未被取出)时才会出现,但这里我们只要求返回1条记录,只要存在匹配项,就会返回该记录,不会触发分页标记。
需要优先修正的语法错误
你的KeyConditionExpression存在语法问题:分区键条件和排序键条件之间必须用AND连接,正确写法如下:
KeyConditionExpression: 'planId = :planId AND begins_with(isComplete#createdBy, :sortKey)'
如果不添加AND,查询会直接报错,无法正常执行。
避免分页/降低分页需求的操作
- 保持
Limit:1的设置:因为你的目标是检查记录是否存在,获取1条匹配记录即可完成验证,这样能将读取消耗降到最低(仅消耗1个标准读取容量单位RCU),同时不会触发分页。 - 可选:用
Select: 'COUNT'优化存在性检查:如果不需要返回具体记录内容,仅需确认是否存在,可以添加Select: 'COUNT'参数。此时查询会返回匹配记录的数量(存在时至少为1),配合Limit:1,消耗的RCU与返回单条记录一致,结果更直接。修改后的查询示例:
{ TableName: 'Workouts', IndexName: 'ByPlanIdIsCompletedAndCreatedBy', KeyConditionExpression: 'planId = :planId AND begins_with(isComplete#createdBy, :sortKey)', ExpressionAttributeValues: { ':planId': '<some-id>', ':sortKey': 'TRUE#BBBB', }, Limit: 1, Select: 'COUNT' };
- 确认索引设计匹配查询需求:当前索引的排序键
isComplete#createdBy通过begins_with匹配TRUE#BBBB的设计是合理的,能精准筛选出isComplete为TRUE且createdBy以BBBB开头的记录,无需调整索引结构。
内容的提问来源于stack exchange,提问作者barshopen
相关产品推荐
相关产品推荐

