【问题标题】:AWS DynamoDB - combining multiple query filters on a single non-key attribute in javaAWS DynamoDB - 在java中的单个非键属性上组合多个查询过滤器
【发布时间】:2014-11-25 20:07:43
【问题描述】:

今年早些时候,Amazon announced 支持对非关键属性的查询过滤器。

可以在单个属性值上组合条件吗?例如,在这种情况下,我想检索与单个“非键”列中某个值列表不匹配的所有项目。

他们的文档指出,每个条件只能包含一个属性值,以便进行比较,例如 NOT_EQUALSBEGINS_WITH。因此,以下内容不起作用:

HashMap<String, Condition> queryFilter = new HashMap<String, Condition>();

List<AttributeValue> AttributeValues = new ArrayList<AttributeValue>();
AttributeValues.add(new AttributeValue().withS("someValue1"));
AttributeValues.add(new AttributeValue().withS("someValue2"));

Condition attributeCondition = new Condition()
    .withComparisonOperator(ComparisonOperator.NE)
    .withAttributeValueList(AttributeValues);

queryFilter.put("COLUMN_1", attributeCondition);

DynamoDBQueryExpression<Item> queryExpression = new DynamoDBQueryExpression<Item>()
    .withHashKeyValues(itemKey)
    .withQueryFilter(queryFilter)
    .withLimit(pPageSize);

看起来只有IN 比较运算符可以保存属性值列表。理想情况下,这些条件应该是可链接的?由于查询过滤器是一个哈希映射,我们不能在同一列上放置多个条件(我已经尝试过):

Condition c1 = new Condition()
    .withAttributeValueList(new AttributeValue().withS("someValue1"))
    .withComparisonOperator(ComparisonOperator.NE);

Condition c2 = new Condition()
    .withAttributeValueList(new AttributeValue().withS("someValue2"))
    .withComparisonOperator(ComparisonOperator.NE);

DynamoDBQueryExpression<Item> queryExpression = new DynamoDBQueryExpression<Item>()
    .withHashKeyValues(itemKey)
    .withConditionalOperator(ConditionalOperator.AND)
    .withQueryFilterEntry("COLUMN_1", c1)
    .withQueryFilterEntry("COLUMN_1", c2)
    .withLimit(pPageSize);

任何帮助或澄清将不胜感激!

谢谢

【问题讨论】:

    标签: java amazon-web-services amazon-dynamodb nosql


    【解决方案1】:

    事实证明,这可以通过向查询中添加 FilterExpression 来实现(最近在此 blog post 中引入)

    我在DynamoDB documentation 中看到了这个,但还没有升级到最新的 AWS Java SDK :(

    使用我上面的例子,这看起来像:

    Map<String, AttributeValue> expressionAttributeValues = new HashMap<String, AttributeValue>();
    expressionAttributeValues.put(":val1", new AttributeValue().withS("someValue1"));
    expressionAttributeValues.put(":val2", new AttributeValue().withS("someValue2"));
    
    DynamoDBQueryExpression<Item> queryExpression = new DynamoDBQueryExpression<Item>()
        .withHashKeyValues(itemKey)
        .withFilterExpression("COLUMN_1 <> :val1 AND COLUMN_1 <> :val2")
        .withExpressionAttributeValues(expressionAttributeValues)
        .withLimit(pPageSize);
    

    感谢 AWS 支持!

    【讨论】:

    • 感谢您抽出宝贵时间回答您的问题
    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    相关资源
    最近更新 更多