查询或扫描 DynamoDB 以查找具有与选项列表匹配的属性的所有行

Query or Scan DynamoDB for all rows which have an attribute that matches a list of options

我有一个具有以下格式的 DynamoDB table

{
    id: "1234" (Primary Key, String)
    billNumber: "01" (Sort Key, String)
    month: 1 (Number)
    product: "Apple" (String)
    itemLocation": "Aisle 1" (String)
}

每个产品都单独写入 table,因此产品不能写入同一行,也不能更新现有条目以附加到产品字段中的值。

我想知道如何查询或扫描此 DDB table 以查找 id "1234" 在月份 1 购买的所有 itemLocations,其中 Product 字段中的值匹配给定产品的列表。

我还有一个关于 id-month 的全局二级索引,我可以用它来查找用户在一个月内购买的所有行。

意思是如果 table 看起来像

id   | billNumber | month |  product    |  itemLocation
1234 |     01     |   1   |   Apple     |  Aisle 1
1234 |     02     |   1   |   Banana    |  Aisle 2
1234 |     03     |   1   |   Cherry    |  Aisle 3
1234 |     04     |   1   |   Coke      |  Aisle 4

我想获取 id "1234""1" 月购买的商品位置,其中产品是 {"Apple", "Banana", "Cherry"} 我会在每一行返回,但 Coke 行如所见下面。

id   | billNumber | month |  product    |  itemLocation
1234 |     01     |   1   |   Apple     |  Aisle 1
1234 |     02     |   1   |   Banana    |  Aisle 2
1234 |     03     |   1   |   Cherry    |  Aisle 3

这是否可以在单个查询或扫描中实现,而无需单独查询每个产品?我相信我可以通过执行 3 个查询来解决示例中的问题。所有 3 个查询中的 ID 和月份相同,每个查询中的产品不同。

我最近看到的可以工作的东西是 DDB Condition Expression 但这似乎没有用于查询,而是用于 CRUD 操作。

你不能拥有看起来像那样的 DDB table...

对于 DDB,当使用复合主键(散列 + 排序)时,组合必须是唯一的。

所以你不能

id   | month |  product   |  itemLocation
1234 |   1   |   Apple    |  Aisle 1
1234 |   1   |   Banana   |  Aisle 2
1234 |   1   |   Cherry   |  Aisle 3
1234 |   1   |   Coke     |  Aisle 4

其中4条记录具有相同的散列键(ID)和排序键(月份)

编辑
好的,现在你有一个有效的 DDB table...

但是你不能为

query()

that id "1234" bought in month "1" where the products were one of {"Apple", "Banana", "Cherry"}

Scan() 可以工作,但效率很低...

为了有效地执行此操作,您需要一个排序键为 month#product

的本地二级索引

现在,根据产品数量,您需要查询3次

Query(table, hk='1234', sk='1#Apple')
Query(table, hk='1234', sk='1#Banana')
Query(table, hk='1234', sk='1#Cherry')

或者只过滤一次产品服务器端或客户端(注意过滤服务器端不保存任何读取容量单位)

Query(table, hk='1234', sk BEGINS WITH '1#')

在这里为以后遇到此问题的其他人添加更新的答案:

您可以将您的产品列表转换为字符串集(类型 SS)并使用您的 ID 和 contains(StringSet, product) 作为过滤器表达式查询您的 DDB。