使用分区键和特定排序键列表查询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运营商

Comparison Operator

a IN(b,c,d) - 如果a等于列表中的任何值,则为真 - 例如,b,c或d中的任何一个。该列表最多可包含100个值,以逗号分隔。

但是,您不能在键属性上使用条件表达式。

Filter Expressions for Query

过滤器表达式不能包含分区键或排序键属性。您需要在键条件表达式中指定这些属性,而不是过滤器表达式。

因此,您可以做的是使用origin作为排序键(或与其他属性复制)以在查询后对其进行过滤。当然过滤器首先读取所有具有'id'的项目,然后过滤器会消耗读取容量并降低效率,但除此之外没有其他方法可以查询。根据您的项目大小和查询频率以及返回项目的估计数量,BatchGetItem可能是更好的选择。

以上是关于使用分区键和特定排序键列表查询DynamoDB的主要内容,如果未能解决你的问题,请参考以下文章

使用主键和排序键上的两个条件查询表

AppSync $util.autoId() 和 DynamoDB 分区和排序键设计问题

DynamoDB 中分区和排序键查询的渐近性能是不是为常数 O(1)?

AppSync GraphQL 订阅以分组数据

如何在 Dynamodb 中查询不同的哈希键和二级索引?

使用全局二级索引的 DynamoDB 表查询项