在使用 Java 的 DynamoDB 扫描中使用包含过滤器
Posted
技术标签:
【中文标题】在使用 Java 的 DynamoDB 扫描中使用包含过滤器【英文标题】:Using contains filter in DynamoDB scan with Java 【发布时间】:2016-08-05 20:35:20 【问题描述】:假设我有一个有效的查询,例如:
ScanRequest scanRequest = new ScanRequest()
.withTableName("myTable")
.withFilterExpression("attr1 = :val1 and attr2 = :val2")
.withExpressionAttributeValues(vm) //contains values for :val1 and :val2
.withLimit(PAGE_SIZE)
.withConsistentRead(READ_TYPE);
现在我想扩展此扫描。假设我的表还有一个属性 attr3,其形式为:
"attr3":
"S": "AAA BBB CCC DDD"
如何过滤 attr3 包含 AAA 的元素?还是 AAA 和 BBB?
【问题讨论】:
【参考方案1】:DynamoDB Condition Expressions Reference documentation 是你的朋友!
在您的具体情况下,您可以使用 contains 函数来搜索子字符串。您的过滤器表达式可能如下所示:
"attr1 = :val1 and attr2 = :val2 and (contains(attr3, :val3a) or contains(attr3, :val3b))"
// where :val3a and :val3b are value placeholders for say AAA and BBB
但我怀疑您想要实现的目标比 DynamoDB 过滤器在服务器端处理的要复杂一些,因此您有两种选择:
-
在应用程序逻辑中进行过滤(即降低您的
将结果发送给客户端并在那里过滤),或者;
改变你的属性
从字符串到列表或字符串集(如果不允许重复)
在任何一种情况下,您都应该知道,使用过滤器的扫描仅在网络带宽方面比常规扫描更有效(在大多数结果被过滤器排除的情况下)。但就消耗的容量而言,无论有无过滤器,扫描都同样昂贵。所以如果你能避免它,不要太依赖扫描你的桌子!
【讨论】:
谢谢。关于您的最后一条评论,假设您想根据任意字段搜索您的数据库,是否有任何替代过滤器扫描的方法? 您可以创建一个全局二级索引,但您应该仔细考虑您的用例,不要尝试将 DynamoDB 用作关系数据库,因为它不是。 包含运算符在Comparison Operator and Function Reference中描述 运算符是否不区分大小写?我在他们使用 OR 和 AND 的文档中看到。好想知道。 是的,IIRC 运算符不区分大小写以上是关于在使用 Java 的 DynamoDB 扫描中使用包含过滤器的主要内容,如果未能解决你的问题,请参考以下文章
使用 lambda 扫描/查询 dynamodb 表中的特定条目
如何使用 nodejs 使用 Dynamodb 并行扫描检索数据
如何使用 node.js 从`AWS dynamodb` 获取/扫描所有项目