dynamodb: how to filter all items which do not have a certain attribute?

amazon-dynamodb, java

Solution

Hope I'm not too late. I've found useful function which you could use in the query. I did not check with ScanRequest but with QueryRequest works as charm.

QueryRequest queryRequest = new QueryRequest()
            .withTableName("YouTableName")
    queryRequest.setFilterExpression(" attribute_not_exists(yourAttributeName) ")
    queryRequest.setExpressionAttributeValues(expressionAttributeValues)
    queryRequest.setExclusiveStartKey(ifYouHave)
    queryRequest.setSelect('ALL_ATTRIBUTES')
    queryRequest.setExpressionAttributeNames(youNames)

attribute_not_exists(yourAttributeName) works with ":aws-sdk:1.11.11" also you could use attribute_exists(yourAttributeName)

Problem

I have a table of users with a primary hash key of userId. each user may/may not have a string attribute called "environment". I would like to get all the users which have "environment"="xyz" or which do not have the "environment" attribute. The following code will filter those users with environment=xyz, but how do I filter those items with no environment at all? Dynamo API will not allow to filter on an empty String. ``` AmazonDynamoDBClient client = DbClientManager.getDynamoDbClient(); ArrayList<AttributeValue> avList = new ArrayList<AttributeValue>(); avList.add(new AttributeValue().withS("xyz")); Condition scanFilterCondition = new Condition() .withComparisonOperator(ComparisonOperator.EQ.toString()) .withAttributeValueList(avList); Map<String, Condition> conditions = new HashMap<>(); conditions.put("environment", scanFilterCondition); ScanRequest scanRequest = new ScanRequest() .withTableName("users") .withAttributesToGet( "userId", "environment"); .withScanFilter(conditions); ScanResult result = client.scan(scanRequest); ``` For now I just dropped the scan filter, and I do the filtering client-side. Bit is there any way to do it server side? Thanks, Aliza

Original source