2017-04-18 302 views
1

DynamoDBを初めて使用していて、Javaを使用してIN句を使用してDynamoDBのテーブルでどのようにクエリを実行できるかを知りたがっています。IN句を使用したDynamoDBのクエリ

私は要件が取得することであるとして

SELECT ID FROM items WHERE Product IN ("apple","orange"). 

または

SELECT Product FROM items WHERE ID IN (100,200). 
+0

真剣に一意である必要はありませんか!?最初のGoogleのヒット=> http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.ReadData.Query.html – Zorglube

+0

これはJavaScriptで、私はJavaでそれを必要とします –

+0

本当にSQLクエリはあなたはそれを送信するために使用する言語に続いて異なる?おそらく、クエリをビルドする方法は変わるかもしれませんが、SQLはSQLのままです。 Criteriaをよく知っていれば、これは=> http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryingJavaDocumentAPI.htmlに役立ちます。基準について気づいていない場合は、その記事を読むことをお勧めします。 – Zorglube

答えて

1

に類似したクエリを実行するitems.それは `sのスキーマという名前のテーブルが

1. Product (Partition Key of type String) 
2. ID (Sort Key of type int) 
3. Date (attribute of type String) 

である必要がありパーティションキーのない製品には、2つのオプションがあります。

1)ソートキー属性にGSI(グローバルセカンダリインデックス)を作成しますId製品を取得するためにクエリAPI

2)スキャンにテーブル全体を使用する - それは完全なテーブルをスキャンして、非常に効率的ではないが

どちらのオプションも、IN演算子をDynamoDBで使用できます。 IDを使用してスキャン用

サンプルコード: - 製品別

Map<String, AttributeValue> attributeValues = new HashMap<>(); 
attributeValues.put(":id1", new AttributeValue().withN("100")); 
attributeValues.put(":id2", new AttributeValue().withN("200")); 

DynamoDBScanExpression dynamoDBScanExpression = new DynamoDBScanExpression() 
                .withFilterExpression("ID IN (:id1, :id2)") 
                .withExpressionAttributeValues(attributeValues); 


PaginatedScanList<yourModelClass> scanList = dynamoDBMapper.scan(yourModelClass.class, dynamoDBScanExpression, 
     new DynamoDBMapperConfig(DynamoDBMapperConfig.ConsistentReads.CONSISTENT)); 

Iterator<yourModelClass> iterator = scanList.iterator(); 

while (iterator.hasNext()) { 
    System.out.println(iterator.next().getTitle()); 
} 

問合せ: -

1)パーティションのオペレータで重要

2をを使用することはできません)することはできませんソートキーを知らずにbatchLoad APIを使用してください

結論: -

効率的なソリューションは、属性IdにGSI(ソートキーなし)を作成し、batchLoad APIを使用することです。

注: GSIのパーティション・キーが

関連する問題