AWS DynamoDB多个“NE”字符串过滤器?

时间:2015-03-16 00:25:20

标签: java android search amazon-dynamodb

我尝试扫描/查询AWS DynamoDB表,查找id(单个字符串)不等于字符串A,B,C,D等任何项目的列表。

我尝试过这样的事情:

for (String itemString : items) {
  scanExpression.addFilterCondition("id", 
      new Condition().withComparisonOperator(ComparisonOperator.NE)
      .withAttributeValueList(new AttributeValue().withS(itemString)));
}

PaginatedScanList<Items> result = mapper.scan(Item.class, scanExpression);

似乎发生的情况是,每次添加过滤器时,它都会覆盖以前的值,因此扫描只会检查一个itemString,而不是几个。我错过了什么,或者这是DynamoDB的限制吗?

注意:如果重要,在我的例子中,我列出了四个值(A,B,C,D),但在生产中,这可能是数百个值的列表。

1 个答案:

答案 0 :(得分:1)

你说你正在做的方式“覆盖以前的价值”是正确的。以下是DynamoDBScanExpression上的1.9.23 SDK中的相关代码:

public void addFilterCondition(String attributeName, Condition condition) {
    if ( scanFilter == null )
        scanFilter = new HashMap<String, Condition>();

    scanFilter.put(attributeName, condition);
}

由于attributeNameid puts DynamoDBScanExpression,因此在这种情况下,最后一个值将获胜。

在我看来,这是来自attributeName的不良行为,我甚至更倾向于说这是一个应该报告的错误。文档没有说明何时添加重复ExpressionAttributeNames并且方法名称使其看起来像是意外行为。

除了构建整个过滤器表达式之外,我没有看到解决此问题的好方法。

另一个注意事项:在documentation上,我没有看到过滤器表达式的持续时间以及允许的ExpressionAttributeValuesStringJoiner 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); 的长度限制请求。如果您尝试过滤掉大量属性值,可能会考虑到这一点,但我没有找到任何有关该限制的文档或您应该期望的行为。

{{1}}