AWS DynamoDB - 在java中的单个非键属性上组合多个查询过滤器

时间:2014-11-25 20:07:44

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

今年早些时候,亚马逊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);

非常感谢任何帮助或澄清!

由于

1 个答案:

答案 0 :(得分:17)

事实证明,通过向查询添加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 Support!