如何在Python中编写DynamoDB过滤表达式,查询含指定日期前结束成员的记录?
正确筛选DynamoDB数组嵌套对象的过滤表达式
你的问题核心是要找出包含至少一个结束日期早于指定日期的成员的DynamoDB记录,之前的写法存在逻辑或语法错误,以下是正确的解决方案:
错误原因分析
- 第一种写法
Attr('members').contains(Attr('end').lt(...))语法错误:contains()方法仅支持传入具体值,不能嵌套条件表达式,因此会触发语法报错。 - 第二种写法
Attr('members.end').lt(...)逻辑错误:该表达式会检查数组中所有成员的end都小于指定日期,而你的示例中存在end为null的成员,导致整个条件不成立,所以无结果返回。
正确实现方式
要筛选数组中存在符合条件的元素,需要使用DynamoDB的ANY操作符,它会检查数组中是否存在至少一个元素满足指定条件。
示例代码
cutoff_date = "2023-01-01T00:00:00" scan_kwargs = { "FilterExpression": "ANY(members.end < :cutoff AND members.end IS NOT NULL)", "ExpressionAttributeValues": {":cutoff": cutoff_date} } response = self.table.scan(**scan_kwargs)
代码说明
ANY(members.end < :cutoff):检查数组中是否存在至少一个成员的end日期早于指定的截止日期。AND members.end IS NOT NULL:排除end为null的成员(这类代表未到期,不属于“已结束且早于指定日期”的范围),如果你的需求不需要排除null,可以去掉这部分条件。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

