在带有 Java 的 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);

现在我想扩展此扫描。假设我的表还有一个属性attr3,其形式为:

"attr3": {
    "S": "AAA BBB CCC DDD"
}

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


答案 1

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

但我怀疑您要实现的目标比 DynamoDB 过滤器在服务器端处理的内容要复杂一些,因此您有两种选择:

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

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


答案 2