如何以单一属性为过滤条件查询DynamoDB表?附时间与产品名筛选需求
实现DynamoDB中类似SQL WHERE子句的过滤(最近24小时+产品名称匹配)
一、优先使用Query API(高效方案,依赖索引)
如果你的表提前创建了全局二级索引(GSI),将产品名称设为分区键、时间戳设为排序键,用Query是最优解——它直接定位目标分区,再过滤时间范围,性能远高于全表扫描。
示例代码(Python boto3)
import boto3 from datetime import datetime, timedelta dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('你的表名') # 计算24小时前的时间戳(适配你表中存储的格式,这里用ISO字符串示例) twenty_four_hours_ago = (datetime.now() - timedelta(hours=24)).isoformat() response = table.query( IndexName='ProductName-Timestamp-index', # 你的GSI名称 KeyConditionExpression='ProductName = :name AND #ts >= :time', ExpressionAttributeNames={ '#ts': 'Timestamp' # 若属性名是DynamoDB保留字,需用别名 }, ExpressionAttributeValues={ ':name': '目标产品名称', ':time': twenty_four_hours_ago } ) # 获取匹配记录 matching_items = response['Items']
关键说明
- 必须提前创建对应GSI,否则无法使用该Query逻辑
- 时间戳建议存Unix时间戳(数字)或ISO 8601字符串,确保范围比较的准确性
二、用Scan API(无索引时的兜底方案)
如果没有合适的索引,只能用Scan全表扫描,通过FilterExpression实现过滤逻辑。注意:Scan会遍历全表,数据量大时性能极差,仅作为临时或小表场景的备选。
示例代码(Python boto3)
import boto3 from datetime import datetime, timedelta dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('你的表名') twenty_four_hours_ago = (datetime.now() - timedelta(hours=24)).isoformat() response = table.scan( FilterExpression='ProductName = :name AND #ts >= :time', ExpressionAttributeNames={ '#ts': 'Timestamp' }, ExpressionAttributeValues={ ':name': '目标产品名称', ':time': twenty_four_hours_ago } ) matching_items = response['Items'] # 处理分页(Scan单次最多返回1MB数据,需循环获取剩余结果) while 'LastEvaluatedKey' in response: response = table.scan( FilterExpression='ProductName = :name AND #ts >= :time', ExpressionAttributeNames={ '#ts': 'Timestamp' }, ExpressionAttributeValues={ ':name': '目标产品名称', ':time': twenty_four_hours_ago }, ExclusiveStartKey=response['LastEvaluatedKey'] ) matching_items.extend(response['Items'])
核心要点
FilterExpression就是DynamoDB实现类似SQL WHERE的核心,支持=、>=、<=、BETWEEN等多种运算符- 分页逻辑不可省略,否则会丢失超过1MB的匹配数据
通用注意事项
- 永远优先选择Query+索引的方案,Scan仅作为无索引时的临时妥协
- 确保时间戳的存储格式统一,避免因类型不匹配导致过滤失效
- 若属性名是DynamoDB保留字(如
Time、Date),必须通过ExpressionAttributeNames定义别名规避冲突
内容的提问来源于stack exchange,提问作者yaminimyn
相关产品推荐
相关产品推荐

