查询或扫描 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。
我有一个具有以下格式的 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。