如何用Python boto3扫描DynamoDB查询含指定嵌套数组元素的公司数据
错误原因
你之前的写法不生效,核心原因是 jobs 字段是List(数组)类型,DynamoDB 不支持直接对List类型字段用 . 操作符访问下级属性,必须先提取List中所有元素的对应属性再做判断。
可行解决方案
两种写法均可实现需求:
写法1:使用boto3条件表达式构造器
from boto3.dynamodb.conditions import Attr # 单个目标岗位的情况 target_job = "painter" response = self.table.scan( FilterExpression=Attr('jobs[*].name').contains(target_job) ) # 如果要匹配多个岗位(满足任意一个即可) target_jobs = ["painter", "driver"] filter_exp = Attr('jobs[*].name').contains(target_jobs[0]) for job in target_jobs[1:]: filter_exp = filter_exp | Attr('jobs[*].name').contains(job) response = self.table.scan( FilterExpression=filter_exp )
写法2:使用原生表达式语法
response = self.table.scan( FilterExpression="contains(jobs[*].name, :target_job)", ExpressionAttributeValues={ ":target_job": "painter" } )
这里的jobs[*].name是DynamoDB的数组投影语法,会返回jobs数组中所有元素的name字段组成的新数组,再用contains函数判断该数组中是否存在目标值即可。
注意事项
Scan操作会遍历全表,数据量大的时候会产生较高的读成本且性能较差,如果该查询为高频查询,建议调整表结构新增GSI(全局二级索引),将岗位名称作为分区键关联公司数据,查询时直接命中GSI即可大幅提升性能。- 如果需要查询同时包含多个目标岗位的公司,将条件拼接符
|(或)修改为&(且)即可。
内容的提问来源于stack exchange,提问作者Gold100
相关产品推荐
相关产品推荐

