Aws Dynamodb Multiple "ne" String Filters?
Solution 1:
You are correct in saying that the way you are doing it "overwrites the previous values". Here is the relevant code from the 1.9.23 SDK on DynamoDBScanExpression
:
publicvoidaddFilterCondition(String attributeName, Condition condition) {
if ( scanFilter == null )
scanFilter = newHashMap<String, Condition>();
scanFilter.put(attributeName, condition);
}
Since your attributeName
will be id
for both puts
, the last value will win in this case.
In my opinion, this is poor behavior from DynamoDBScanExpression
, and I would even lean more towards saying it is a bug that should be reported. The documentation does not state anything about when a duplicate attributeName
is added and the method name makes it seem like this is unexpected behavior.
I don't see a good way to work around this other than building out the entire filter expression.
Another Note: On the documentation, I don't see a length constraint for how long a filter expression can be as well as how many ExpressionAttributeNames
and ExpressionAttributeValues
are allowed on a request. That may come into account if you are trying to filter out a ton of attribute values, but I haven't found any documentation of what that limit might be or what behavior you should expect.
StringJoiner filterExpression = new StringJoiner(" AND ");
Map<String, AttributeValue> expressionAttributeValues = new HashMap<>();
int itemAttributeSuffix = 0;
for (String itemString : items) {
StringBuilder expression = new StringBuilder("#idname")
.append(" ")
.append("<>")
.append(" ")
.append(":idval")
.append(itemAttributeSuffix);
filterExpression.add(expression);
expressionAttributeValues.put(":idval" + itemAttributeSuffix++,
new AttributeValue().withS(itemString));
}
Map<String, String> expressionAttributeNames = Collections.singletonMap("#idname", "id");
scanExpression.setFilterExpression(filterExpression.toString());
scanExpression.setExpressionAttributeNames(expressionAttributeNames);
scanExpression.setExpressionAttributeValues(expressionAttributeValues);
PaginatedScanList<Items> result = mapper.scan(Item.class, scanExpression);
Post a Comment for "Aws Dynamodb Multiple "ne" String Filters?"