假设我有一个分区键Set<List<String>> set = new TreeSet<List<String>>(new Comparator<List<String>>() {
@Override
public int compare(List<String> l1, List<String> l2){
//compares the lists based on first index
return l1.get(0).compareTo(l2.get(0));
}
});
,它有几个排序键,例如User:user@email.com
,Data
,Sale:001
。
现在,如果我要删除该用户怎么办?
我已经考虑过使用API的两种可能方式。
1-扫描
首先执行Contact:001
,其中SCAN
,获取结果,并使用相应的排序键对每个返回的项目进行批量删除。
2-查询
为此,我首先需要将所有排序键更改为具有公共前缀,例如partition-key=User:user@email
,User|Data
,User|Sale:001
,然后在其中查询
User|Contact:001
获得结果后,我将像扫描选项一样进行批量删除。
我不清楚哪个选项是最佳选择,因为我不确定扫描是否具有“智能”功能仅在特定分区内进行扫描,还是会扫描表中的每个记录。因为在DynamoDB中,您需要为“搜索到的”项目的每kb支付费用
因为它是智能的,所以我认为它的成本与查询选项相同,而无需在我的排序键上添加前缀。
答案 0 :(得分:1)
Scan()除作为过滤器表达式外,不支持partition-key=User:user@email
。
是的,整个表将被读取。实际上只有匹配的记录会被返回。
另一方面, Query()需要partition-key=user:user@email
作为关键条件表达式。您无需对排序键设计进行任何更改;因为包括排序键的键条件是optional。
必须进行分区键相等性测试,并且必须在 以下格式:
partitionKeyName =:partitionkeyval
如果您还想提供排序键的条件,则必须为 结合使用AND与排序键的条件。以下是 一个示例,使用=比较运算符作为排序键:
partitionKeyName =:partitionkeyval和sortKeyName =:sortkeyval