我有一个DyanmoDB表,为了这个问题看起来像这样:
我想在表中查询特定id下的起源子集。 根据我的理解,唯一的运营商DynamoDB允许查询中的排序键位于'between','begin_with','=','< ='和'> ='。
问题是我的查询需要一种'CONTAINS'形式,因为'origin'列表不一定是有序的(对于between运算符)。
如果这是SQL,那将是:
SELECT * from Table where id={id} AND origin IN {origin_list}
我的确切问题是:我需要做什么才能以最有效的方式实现此功能?我应该改变我的表结构吗?也许加一个GSI?接受建议。
我知道这可以通过扫描操作实现,但我希望有一个有效的查询。对于BatchGetItem也是如此,除非绝对必要,否则我宁愿避免使用该功能。
由于
答案 0 :(得分:1)
这是使用Filter Expressions for Query的情况。它有IN
运算符
a IN(b,c,d) - 如果a等于列表中的任何值,则为true - for 例如,b,c或d中的任何一个。该列表最多可包含100个值, 以逗号分隔。
但是,您不能在关键属性上使用条件表达式。
过滤器表达式不能包含分区键或排序键 属性。您需要在密钥条件中指定这些属性 表达式,而不是过滤器表达式。
因此,您可以做的是使用origin作为排序键(或使用其他属性复制它)以在查询后对其进行过滤。当然过滤器首先会读取所有具有该标识的项目' id'和过滤器后来消耗读取容量和效率较低但没有其他方法来查询否则。根据您的项目大小和查询频率以及返回项目的估计数量,BatchGetItem可能是更好的选择。