首页 > 解决方案 > DynamoDB contains() FilterExpression with query() 而不是 scan()

问题描述

我想从表中获取所有带有 query() 的项目,而不是使用扫描,因为它非常昂贵
我可以在没有 table.scan() 的情况下使用 .contains()

dynamodb = boto3.resource('dynamodb')
table= dynamodb.Table('investors')
data = table.scan(
        FilterExpression=Attr('groups_name').contains('person_name')
)

# Something like this
data = table.query(...
    ....    
    ('groups_name').contains('person_name')
)

在我的 DynamoDB -> 投资者(表)(都有相同的分区键='fund')
-> 示例项目 -> groups_name [list]:person_name(字符串)

标签: amazon-web-servicesamazon-dynamodbboto3

解决方案


如果要从表中获取所有项目并具有多个分区键值,则必须使用Scan. API对Query单个项目集合(即具有相同分区键的所有项目)进行操作,FilterExpression并且也可以在那里进行过滤。

包含过滤器也不适用于 Query 操作中的 aKeyConditionExpression或 the FilterExpression,最接近的匹配项是starts_with,但这是不同的。

为了有效地处理这种访问模式,您需要重新考虑您的数据模型。


推荐阅读