Back

Explore Courses Blog Tutorials Interview Questions
0 votes
2 views
in AWS by (19.1k points)

Earlier this year Amazon announced the support of query filters on non-key attributes. 

Can conditions be combined on a single attribute value? For example, in this scenario, I would like to retrieve all items which do not match a certain list of values in a single 'non-key' column. 

Their documentation states that each condition can only hold one attribute value for comparisons like NOT_EQUALS or BEGINS_WITH. The following therefore does not work: 

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);

It looks like only the IN comparison operator can hold a list of attribute values. Ideally, these conditions should be chainable? Since the query filter is a hash map we cannot put multiple conditions on the same column (I've tried): 

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);

Any help or clarification would be greatly appreciated!

1 Answer

0 votes
by (44.4k points)

Check this DynamoDB documentation for more information, so use the latest AWS SDK for JAVA.

It would look like this:

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);

Related questions

0 votes
1 answer

Want to get 50% Hike on your Salary?

Learn how we helped 50,000+ professionals like you !

Browse Categories

...