如何用Python3在AWS中配置DynamoDB嵌套map属性的filter表达式
问题原因
- 嵌套属性访问方式错误:DynamoDB 的
ExpressionAttributeNames不支持直接传入带.的嵌套路径作为属性别名映射值,你当前的写法会被解析为查找**顶级属性名就是deliverables.fc986523-a666-478e-8303-2a1c3c1dc4ba**的字段,而非deliverablesmap下的对应key,自然匹配不到任何数据。
可行解决方案
方案1:修正原生client写法
调整属性别名映射规则,拆分嵌套层级,修正后的代码如下:
import boto3 result = [] dynamo_client = boto3.client("dynamodb") paginator = dynamo_client.get_paginator("scan") operation_parameters = { 'FilterExpression': "#deliverables.#target_id = :deliverable", 'ExpressionAttributeNames': { '#deliverables': 'deliverables', '#target_id': 'fc986523-a666-478e-8303-2a1c3c1dc4ba' }, 'ExpressionAttributeValues': { ':deliverable': { "M": { "read": {"BOOL": True}, "upload": {"BOOL": True}, "write": {"BOOL": True} } } } } for page in paginator.paginate(TableName="TableName", **operation_parameters): result.extend(page["Items"]) # 用extend替代append避免结果嵌套多层数组 print(result)
方案2:改用boto3 resource客户端(更简洁)
无需手动声明DynamoDB类型标记,降低写法出错概率:
import boto3 dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('TableName') scan_params = { 'FilterExpression': "#deliverables.#target_id = :deliverable", 'ExpressionAttributeNames': { '#deliverables': 'deliverables', '#target_id': 'fc986523-a666-478e-8303-2a1c3c1dc4ba' }, 'ExpressionAttributeValues': { ':deliverable': { "read": True, "upload": True, "write": True } } } result = [] while True: response = table.scan(**scan_params) result.extend(response['Items']) # 处理超过1MB的分页场景 if 'LastEvaluatedKey' not in response: break scan_params['ExclusiveStartKey'] = response['LastEvaluatedKey'] print(result)
按照你提供的样例数据,修正后会正确返回username为username1的item,另一条upload和write为false的item会被过滤。
内容的提问来源于stack exchange,提问作者Manoj Kommineni
相关产品推荐
相关产品推荐

