是否可以在python中过滤DynamoDB查询结果?

时间:2020-11-11 01:01:00

标签: python amazon-web-services amazon-dynamodb boto3

我的数据格式如下

{
  ID:'some uuid'
  Email:'some@email.com',
  Tags=[tag1,tag2,tag3...],
  Content:' some content'
}

分区键是ID,排序键是Email 如果我只想通过电子邮件查询,则创建了电子邮件的辅助索引“ email_index”, 现在我想通过电子邮件和特定标签查询数据 例如,我要查找所有包含Email='some@email.com'且标签包含“ tag2”的数据, 我想先通过“ email_index”进行查询

result=table.query(
            IndexName='EmailIndex',
            KeyConditionExpression='Email=:email',
            ExpressionAttributeValues={
                ':email':'some@email.com'
            }
)['Items']

然后使用Attr('Tags').contains('tag2')扫描结果 那么可以同时做两个吗?还是我必须编写一个循环来过滤Python中的查询结果?

1 个答案:

答案 0 :(得分:2)

对于DynamoDB,标记可能是一个棘手的用例。

一种选择是在查询操作中使用FilterExpression

result=table.query(
            IndexName='EmailIndex',
            KeyConditionExpression='Email=:email',
            FilterExpression: 'contains(Tags, :tag)',
            ExpressionAttributeValues={
                ':email':'some@email.com',
                ':tag': 'tag1'
            }
)['Items']

如上所述,另一种选择是在应用程序代码中进行检查。

如果这对于您的用例而言不够灵活,则您可能需要研究更强大的搜索解决方案,例如Elasticsearch。