DynamoDB中JSON类型字段存储对象数组时如何匹配任意下标的指定元素
DynamoDB 数组对象元素属性匹配查询解决方案
方案1:优化数据模型(最高效,推荐)
这种方案适合可以调整表结构的场景,查询效率远高于直接扫描数组:
- 新增一个
receiver_id_set字段,类型设为字符串集合(SS类型),写入receiver数组数据时,同步把所有元素的id值存入该集合 - 查询时使用如下FilterExpression:
contains(receiver_id_set, :target_id) - 对应的ExpressionAttributeValues配置:
{ ":target_id": { "S": "r1" } } - 额外优化:如果这类查询是高频场景,可以把
receiver_id_set设为GSI的分区键,直接用Query操作而非Scan,进一步降低查询成本、提升响应速度。
方案2:不修改表结构,直接使用FilterExpression
如果无法调整表结构,可以直接通过过滤表达式实现全数组匹配,分两种语法情况:
支持最新DynamoDB表达式语法的场景
直接使用数组条件匹配表达式,无需关心数组长度:
- FilterExpression写法:
receiver[?id == :rid] <> [] - 表达式含义:遍历
receiver所有元素筛选出id等于指定值的元素,只要返回的筛选结果数组不为空,就说明存在符合要求的条目 - 对应的ExpressionAttributeValues配置:
{ ":rid": { "S": "r1" } }
旧版本SDK不支持上述语法的场景
如果已知receiver数组的最大长度,可以把所有下标的匹配条件用OR拼接:
receiver[0].id = :rid OR receiver[1].id = :rid OR receiver[2].id = :rid OR ...
注意:所有使用FilterExpression的方案都是先扫描数据再过滤,大表场景下性能差、成本高,仅适合低频查询或者小表场景。
内容的提问来源于stack exchange,提问作者Also James
相关产品推荐
相关产品推荐

