你说你这样做的方式“覆盖以前的值”是正确的。这是DynamoDBScanExpression上1.9.23 SDK的相关代码:
public void addFilterCondition(String attributeName, Condition condition) {
if ( scanFilter == null )
scanFilter = new HashMap<String, Condition>();
scanFilter.put(attributeName, condition);
}
由于您的attributeName 对于puts 都将是id,因此在这种情况下,最后一个值将获胜。
在我看来,这是 DynamoDBScanExpression 的不良行为,我什至更倾向于说这是一个应该报告的错误。文档没有说明何时添加了重复的 attributeName 并且方法名称使它看起来像是意外行为。
除了构建整个过滤器表达式之外,我没有找到解决此问题的好方法。
另一个注意事项:在documentation 上,我没有看到过滤器表达式的长度限制以及请求中允许的ExpressionAttributeNames 和ExpressionAttributeValues 的数量。如果您尝试过滤掉大量属性值,可能会考虑到这一点,但我还没有找到任何关于该限制可能是什么或您应该期待什么行为的文档。
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);