【问题标题】:Using contains filter in DynamoDB scan with Java在使用 Java 的 DynamoDB 扫描中使用包含过滤器
【发布时间】: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?

【问题讨论】:

    标签: java amazon-web-services filter amazon-dynamodb contains


    【解决方案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 过滤器在服务器端处理的要复杂一些,因此您有两种选择:

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

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

    【讨论】:

    • 谢谢。关于您的最后一条评论,假设您想根据任意字段搜索您的数据库,是否有任何替代过滤器扫描的方法?
    • 您可以创建一个全局二级索引,但您应该仔细考虑您的用例,不要尝试将 DynamoDB 用作关系数据库,因为它不是。
    • 包含运算符在Comparison Operator and Function Reference中描述
    • 运算符是否不区分大小写?我在他们使用 OR 和 AND 的文档中看到。好想知道。
    • 是的,IIRC 运算符不区分大小写
    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多