如何用Python实现DynamoDB多条件查询及优化日期存储与查询?
问题解答
一、组合Section与Percentage的筛选条件
首先明确:DynamoDB中Key()仅用于**主键(分区键/排序键)**的条件,普通属性的筛选需用Attr()。如果Section和Percentage都不是主键,正确的筛选表达式要用逻辑与(&)组合两个条件:
from boto3.dynamodb.conditions import Attr # 注意匹配数据类型:若Percentage在DynamoDB中是字符串类型则用引号,数字类型则不用 fe = Attr('Section').eq(10) & Attr('Percentage').between("90", "100") response = table.scan(FilterExpression=fe)
你之前返回不符合预期的结果,大概率是因为查询时的数值类型和表中存储的类型不匹配——比如表中Percentage是字符串,但查询用了数字90/100,反之亦然,务必保证类型一致。
二、日期查询与最优存储格式
1. 针对现有日期格式的查询方法
如果你的日期是非排序友好的字符串格式(如MM/DD/YYYY、DD-MM-YYYY),直接用between会因字符串排序逻辑(按字符顺序)导致结果错误。解决方式:
- 若日期是字符串,先确认格式是否为字典序与时间序一致(如
YYYY-MM-DD),查询时用完全相同的格式写起始/结束值; - 若为自定义格式,先在代码中将查询的日期转换成和表中完全一致的格式,再用
Attr('Date').between(start_date, end_date)执行筛选。
2. 最优日期存储格式
DynamoDB推荐两种日期存储方案:
- ISO 8601字符串:例如
2024-05-20T14:30:00Z,优点是可读性强,天然支持字典序排序(和时间序一致),适合需要直观查看日期的场景; - Unix时间戳(数字类型):例如
1716196200(秒级)或1716196200000(毫秒级),优点是计算和比较效率更高,适合频繁做时间范围查询或计算的场景。
这两种格式都能确保between、gt、lt等范围查询的结果符合预期。
内容的提问来源于stack exchange,提问作者user19540656
相关产品推荐
相关产品推荐

