代码之家  ›  专栏  ›  技术社区  ›  Chaos Monkey

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

  •  2
  • Chaos Monkey  · 技术社区  · 6 年前

    我有一个DyanModb表,针对这个问题,它看起来如下:

    • ID(字符串分区键)
    • 原点(字符串排序键)

    我想查询表中特定ID下源的子集。 据我所知,在查询中,dynamodb只允许使用'between'、'begins_with'、'='、'<='和'>='。

    问题是我的查询需要“contains”的形式,因为“origins”列表不一定是有序的(对于between运算符)。

    如果这是SQL,它将类似于:

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

    我的确切问题是:为了以最有效的方式实现这个功能,我需要做什么?我应该改变我的桌子结构吗?可能加上GSI?乐于接受建议。

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

    谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   Can Sahin    6 年前

    这是使用筛选表达式进行查询的情况。它有 IN 操作人员

    Comparison Operator

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

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

    Filter Expressions for Query

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

    所以,您可以做的是使用origin而不是作为排序键(或者用另一个属性复制它)来在查询后过滤它。当然,filter首先读取所有项目的id,然后进行过滤,这样会消耗读取容量,并且效率较低,但是没有其他方法可以查询它。根据项目大小、查询频率和估计返回的项目数,batchGetItem可能是更好的选择。