需要扫描具有记录的字典对象列表的Dynamo DB。 以下是我的示例数据
'toAddr': [{'type': 'email', 'address': 'aaa@gmail.com'}, {'type': 'email', 'address': 'bbb@gmail.com'}]}
下面的代码行对我来说很有必要。
client = boto3.resource('dynamodb')
table = client.Table(table_name)
response = table.scan(FilterExpression="contains (#items, :itemVal)",
ExpressionAttributeNames={"#items": "toAddr"},
ExpressionAttributeValues={":itemVal":{"address":"aaa@gmail.com",
type":"email"}})
但是我想以以下格式构建过滤器表达式
response = table.scan(FilterExpression=Attr('toAddr').contains('itemVal'),
ExpressionAttributeValues={":itemVal":{"address":"aaa@gmail.com",
"type":"email"}})
但这会导致错误
botocore.exceptions.ClientError:调用扫描操作时发生错误(ValidationException):ExpressionAttributeValue中提供的值表达式中未使用的值:键:{:itemVal}
答案 0 :(得分:2)
contains
函数仅允许您搜索字符串中的字符串或集合中的字符串。您将需要重组数据,或者需要在python代码中过滤扫描结果。
答案 1 :(得分:1)
在第二个代码段中,'itemVal'
只是一个字符串,与:itemVal
中的ExpressionAttributeValues
不匹配。按照您建议的格式,您可以摆脱ExpressionAttributeValues
,而使用类似这样的方法:
itemVal = {"address": "aaa@gmail.com", "type": "email"}
response = table.scan(
FilterExpression=Attr('toAddr').contains(json.dumps(itemVal))
)
答案 2 :(得分:0)
@tommy,您的答案几乎是正确的,除了我们不应该使用json.dumps
<?php
header( 'Content-Type: application/pkcs7-mime' );
// Read the static file or just generate a dynamic content.
@readfile( __DIR__ . '/apple-app-site-association.json' );
exit;
以上内容有助于扫描结果。