使用分区键和特定排序键列表查询DynamoDB
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用分区键和特定排序键列表查询DynamoDB相关的知识,希望对你有一定的参考价值。
我有一个DynamoDB表,为了这个问题看起来像这样:
- id(字符串分区键)
- origin(字符串排序键)
我想在表中查询特定id下的起源子集。根据我的理解,唯一的运算符DynamoDB允许查询中的排序键是“在'之间','begin_with','=','<='和'> ='。
问题是我的查询需要一种'CONTAINS'形式,因为'origin'列表不一定是有序的(对于between运算符)。
如果这是SQL,它将是这样的:
SELECT * from Table where id={id} AND origin IN {origin_list}
我的确切问题是:我需要做什么才能以最有效的方式实现此功能?我应该改变我的表结构吗?也许加一个GSI?接受建议。
我知道这可以通过扫描操作实现,但我希望有一个有效的查询。 BatchGetItem也是如此,除非绝对必要,否则我宁愿避免使用该功能。
谢谢
这是使用筛选表达式进行查询的情况。它有IN
运营商
a IN(b,c,d) - 如果a等于列表中的任何值,则为真 - 例如,b,c或d中的任何一个。该列表最多可包含100个值,以逗号分隔。
但是,您不能在键属性上使用条件表达式。
过滤器表达式不能包含分区键或排序键属性。您需要在键条件表达式中指定这些属性,而不是过滤器表达式。
因此,您可以做的是使用origin作为排序键(或与其他属性复制)以在查询后对其进行过滤。当然过滤器首先读取所有具有'id'的项目,然后过滤器会消耗读取容量并降低效率,但除此之外没有其他方法可以查询。根据您的项目大小和查询频率以及返回项目的估计数量,BatchGetItem可能是更好的选择。
以上是关于使用分区键和特定排序键列表查询DynamoDB的主要内容,如果未能解决你的问题,请参考以下文章
AppSync $util.autoId() 和 DynamoDB 分区和排序键设计问题