使用字符串集的Android DynamoDB过滤表达式

时间:2016-09-17 06:06:33

标签: android amazon-dynamodb

我正在尝试使用字符串集过滤查询结果。我的字符串集由国家组成。

基本上,在执行查询之后,我希望过滤器查看字符串集的内容,然后只显示国家/地区在字符串集中的结果。这可能吗?这是我的代码:

String[] countries = { "Japan", "Vietnam", "Thailand"};
Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":val2", new AttributeValue().withSS(countries));

DynamoDBQueryExpression queryExpression = new DynamoDBQueryExpression()
    .withFilterExpression("Place IN (:val2)") // this is the line i'm confused about
    .withExpressionAttributeValues(eav)
    .withHashKeyValues(someHashValue);

// Results of query should only show those with Place = Japan, Vietnam, or Thailand

其中“Place”是我要检查的列的名称。

我知道这样做的一种方法是使用多个OR语句来检查。但是,我希望此过滤器与任何字符串集大小兼容,因此看起来OR语句不是可行的方法。

我完全赞赏任何指导。提前谢谢!

1 个答案:

答案 0 :(得分:0)

一件事 - StringSet是DynamoDB项目字段的值类型,而不是可以用来同时查询多个事物的值。

我环顾四周,发现了一些优雅的设计方法,但它们已被弃用了。我建议您自己构建查询字符串。例如......

String[] countries = {"Japan", "Vietnam", "Thailand"};

List<String> queries = new ArrayList<>();
Map<String, AttributeValue> eav = new HashMap<>();

for (Integer i = 0; i < countries.length; i++) {
    String placeholder = ":val" + i;
    eav.put(placeholder, new AttributeValue().withS(countries[i]));
    queries.add("Place = " + placeholder);
}

String query = String.join(" or ", queries);

DynamoDBQueryExpression queryExpression = new DynamoDBQueryExpression()
    .withFilterExpression(query)
    .withExpressionAttributeValues(eav)
    .withHashKeyValues(someHashValue);

我还没有测试过,但这是你要做的事情(除非有更好的方式,我还没有看到)。