在Java中使用包含过滤器的DynamoDB扫描

use*_*897 13 java contains filter amazon-web-services amazon-dynamodb

假设我有一个有效的查询,例如:

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);
Run Code Online (Sandbox Code Playgroud)

现在我想扩展这个扫描.假设我的表还有一个attr3属性,其格式如下:

"attr3": {
    "S": "AAA BBB CCC DDD"
}
Run Code Online (Sandbox Code Playgroud)

如何过滤attr3包含AAA的元素?还是AAA和BBB?

Mik*_*scu 26

DynamoDB 条件表达式参考文档是您的朋友!

在您的特定情况下,您可以使用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
Run Code Online (Sandbox Code Playgroud)

但我怀疑你想要实现的东西比DynamoDB过滤器在服务器端处理要复杂得多,所以你有两个选择:

  1. 在应用程序逻辑中进行过滤(即将结果记录到客户端并在那里过滤),或者;
  2. 将您的属性从字符串更改为列表或字符串集(如果不允许重复)

在任何一种情况下,您都应该知道,在网络带宽方面,使用过滤器扫描只比常规扫描更有效(在大多数结果被过滤器排除的情况下).但就容量消耗而言,无论是否使用过滤器,扫描都同样昂贵.所以,如果你可以避免它,不要过分依赖扫描你的桌子!

  • 您可以创建一个全局二级索引,但是您应该仔细考虑您的用例,不要像关系数据库那样尝试使用DynamoDB,因为它不是。 (2认同)