2016-09-17 11 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 

ここで、「場所」はチェックしようとしている列の名前です。

これを行う1つの方法は、複数のOR文を使用してチェックすることです。しかし、私はこのフィルタを任意の文字列セットのサイズと互換性があるようにしたいので、OR文が行く方法ではないようです。

ご指摘いただきありがとうございます。前もって感謝します!

答えて

0

1つのこと - 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

関連する問題