DynamoDB如何使用query()替代scan()执行contains()过滤查询
DynamoDB使用query实现contains过滤的实现方案
核心结论
可以使用query替代scan实现groups_name字段的contains过滤逻辑,你的表所有条目分区键均为fund的设计完全满足query操作的前置要求。
注意:
contains仅支持在FilterExpression中使用,无法作为键查询条件,过滤逻辑会在DynamoDB读取完指定分区的所有数据后执行,不会降低该分区内已扫描数据的读容量消耗。
可直接运行的实现代码
import boto3 from boto3.dynamodb.conditions import Key, Attr dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('investors') data = table.query( # 请将下方<你的分区键字段名>替换为表实际的分区键字段名称 KeyConditionExpression=Key('<你的分区键字段名>').eq('fund'), FilterExpression=Attr('groups_name').contains('person_name') )
额外注意事项
- 如果你原表除了
fund分区外还有其他分区,该写法的成本远低于全表scan,因为只会扫描fund这一个分区内的数据。 - 如果
fund分区下数据量极大,想要进一步降低读取成本,建议调整表结构:新增全局二级索引(GSI),将groups_name列表中的每个人名单独作为索引的分区键存储,即可直接通过键条件查询匹配的条目,不需要后过滤,大幅降低容量消耗。 - 该写法的
contains对列表类型字段的匹配逻辑和你之前scan的逻辑完全一致,会正确识别列表中是否存在目标字符串元素。
内容的提问来源于stack exchange,提问作者Shubham K.
相关产品推荐
相关产品推荐

