我的数据格式如下
{
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中的查询结果?
答案 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。