2016-09-17 35 views
1

我想要使用字符串集来过滤查询的结果。我的字符串集合由国家组成。Android 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 

其中“地点”是我试图检查的列的名称。

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

我很欣赏任何指导。提前致谢!

回答

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); 

我没有测试过,但是这是那种你会看这样做(除非有,我还没有看到一个更好的方式)的东西。

+0

Trey,非常感谢您的帮助!手动构建查询字符串对我的设计非常有用。我使用的唯一区别是我不想使用.join方法,因为它需要导入另一个库,所以我只是使用另一个for循环手动组合字符串和附加的OR。 谢谢Trey!真的很感激它! – skippyco