使用分区键和特定排序键列表查询DynamoDB

时间:2018-05-22 13:31:27

标签: amazon-web-services amazon-dynamodb

我有一个DyanmoDB表,为了这个问题看起来像这样:

  • id(字符串分区键)
  • origin(字符串排序键)

我想在表中查询特定id下的起源子集。 根据我的理解,唯一的运营商DynamoDB允许查询中的排序键位于'between','begin_with','=','< ='和'> ='。

问题是我的查询需要一种'CONTAINS'形式,因为'origin'列表不一定是有序的(对于between运算符)。

如果这是SQL,那将是:

SELECT * from Table where id={id} AND origin IN {origin_list}

我的确切问题是:我需要做什么才能以最有效的方式实现此功能?我应该改变我的表结构吗?也许加一个GSI?接受建议。

我知道这可以通过扫描操作实现,但我希望有一个有效的查询。对于BatchGetItem也是如此,除非绝对必要,否则我宁愿避免使用该功能。

由于

1 个答案:

答案 0 :(得分:1)

这是使用Filter Expressions for Query的情况。它有IN运算符

Comparison Operator

  

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

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

Filter Expressions for Query

  

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

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