如何在单条查询中结合BETWEEN与begins_with操作符
针对DynamoDB sortKey范围+固定前缀的查询方案
你的sortKey结构是paddedId#paddedProperty1#paddedProperty2#uuid,要同时实现paddedId范围查询、匹配固定的paddedProperty1/paddedProperty2且忽略uuid后缀,完全可以用单条查询搞定,具体方法如下:
关键思路
既然paddedProperty1和paddedProperty2是你要固定匹配的值,那就把它们和paddedId拼接成完整的前缀模板,再用BETWEEN结合ASCII最大值构造边界,覆盖所有符合条件的uuid后缀。
具体操作
假设你要查paddedId从001000到002000,paddedProperty1是PROP1,paddedProperty2是PROP2:
- 构造起始匹配值:
001000#PROP1#PROP2# - 构造结束匹配值:
002000#PROP1#PROP2#\xFF(\xFF是ASCII码里的最大值,能匹配任何以002000#PROP1#PROP2#开头的字符串,不管后面的uuid是什么) - 执行查询时,给sortKey加条件:
sortKey BETWEEN '001000#PROP1#PROP2#' AND '002000#PROP1#PROP2#\xFF'
原理说明
DynamoDB的字符串排序严格遵循ASCII码顺序:
- 所有合法的短uuid字符(字母、数字等)的ASCII值都小于
\xFF,所以只要sortKey以002000#PROP1#PROP2#开头,就一定会落在002000#PROP1#PROP2#和002000#PROP1#PROP2#\xFF之间 - 这样既限定了paddedId的范围,又固定了paddedProperty1和paddedProperty2的值,自动过滤掉不符合的记录,同时忽略uuid后缀
注意点
- 必须保证paddedId的填充格式完全统一(比如都是6位数字),否则范围查询会出现漏查或误查
- 如果paddedProperty1/2本身包含
#,得提前替换成其他无冲突字符,不然会破坏sortKey的结构匹配
内容的提问来源于stack exchange,提问作者Sam Steele
相关产品推荐
相关产品推荐

