在使用 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 表中的特定条目

我们可以避免在 dynamodb 中进行扫描吗

如何使用 nodejs 使用 Dynamodb 并行扫描检索数据

如何使用 node.js 从`AWS dynamodb` 获取/扫描所有项目

使用保留关键字作为 FilterExpression NodeJS 扫描 DynamoDB 中的函数

DynamoDb:扫描查询不会返回所有数据