AWS DynamoDB Scan查询无结果求助:按非分区键查询失败
DynamoDB Scan查询异常的解决方法
问题说明
DynamoDB表以id作为分区键,未设置排序键,执行以下Scan代码后无法返回表中已存在的目标记录,且response['ScannedCount']小于表总记录数:
response = producttable.scan(FilterExpression=Attr('title').eq("My Product"))
核心原因
DynamoDB的Scan操作存在默认分页限制:单次请求最多返回1MB数据或1000条记录,超出限制的部分不会一次性返回,而是通过LastEvaluatedKey标记下一页的起始位置。如果目标记录在未扫描的分页中,就会出现查不到的情况,同时ScannedCount仅统计单次扫描的记录数,自然小于总记录数。
解决步骤
1. 处理分页获取全量数据
循环调用Scan,直到返回结果中不再包含LastEvaluatedKey,合并所有分页的结果:
from boto3.dynamodb.conditions import Attr # 初始化请求 response = producttable.scan(FilterExpression=Attr('title').eq("My Product")) matched_items = response['Items'] # 循环获取剩余分页数据 while 'LastEvaluatedKey' in response: response = producttable.scan( FilterExpression=Attr('title').eq("My Product"), ExclusiveStartKey=response['LastEvaluatedKey'] ) matched_items.extend(response['Items']) # matched_items 即为所有符合条件的记录
2. 额外检查项
- 确认
title字段的大小写、空格、特殊字符完全匹配,DynamoDB的字符串匹配是精确匹配,无模糊处理 - 检查表中目标记录的字段名是否正确,避免拼写错误(比如误写为
Title而非title) - 若表数据量较大,Scan操作效率极低,建议给
title创建全局二级索引(GSI),之后用Query操作替代Scan,大幅提升查询性能
内容的提问来源于stack exchange,提问作者khteh
相关产品推荐
相关产品推荐

