2016-06-30 7 views
0

AWS DynamoDBテーブルからデータを取得しています。以下のコードでは、このコードでテーブルから単一の項目をフェッチできます。com.amazonaws.AmazonServiceException:クエリキー条件がサポートされていません

Condition hashKeyCondition = new Condition() 
      .withComparisonOperator(ComparisonOperator.GE.toString()) 
      .withAttributeValueList(new AttributeValue().withN("1")); 

    Map<String, Condition> keyConditions = new HashMap<String, Condition>(); 
    keyConditions.put("ID", hashKeyCondition); 

    Map<String, AttributeValue> lastEvaluatedKey = null; 

    do 
    { 
     QueryRequest queryRequest = new QueryRequest() 
       .withTableName("TABLE_NAME") 
       .withKeyConditions(keyConditions) 
       .withExclusiveStartKey(lastEvaluatedKey); 

     QueryResult queryResult = dynamoDBClient.query(queryRequest); 

     for (Map<String, AttributeValue> item : queryResult.getItems()) 
     { 
      String value = item.get("column_name").getS(); 
      Log.i("MainActivity", value); 
     } 

     lastEvaluatedKey = queryResult.getLastEvaluatedKey(); 

    } while (lastEvaluatedKey != null); 


しかし、私はID =「1」より大きいすべてのアイテムを取得しようとしています。そこでComparisonOperator.GEComparisonOperator.GTに変更しました。以下は、以下のコードです。

Condition hashKeyCondition = new Condition() 
    .withComparisonOperator(ComparisonOperator.GT.toString()) 
    .withAttributeValueList(new AttributeValue().withN("1")); 

Map<String, Condition> keyConditions = new HashMap<String, Condition>(); 
keyConditions.put("ID", hashKeyCondition); 

Map<String, AttributeValue> lastEvaluatedKey = null; 

do 
{ 
    QueryRequest queryRequest = new QueryRequest() 
      .withTableName("TABLE_NAME") 
      .withKeyConditions(keyConditions) 
      .withConsistentRead(true) 
      .withExclusiveStartKey(lastEvaluatedKey); 

    QueryResult queryResult = dynamoDBClient.query(queryRequest); 

    for (Map<String, AttributeValue> item : queryResult.getItems()) 
    { 
     String value = item.get("column_name").getS(); 
     Log.i("MainActivity", value); 
    } 

    lastEvaluatedKey = queryResult.getLastEvaluatedKey(); 

} while (lastEvaluatedKey != null); 


しかし、私はAmazonServiceException
com.amazonaws.AmazonServiceException: Query key condition not supported (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXを取得しています。

お願いします。

答えて

2

私はコード作品の最初の作品に少し驚いていますが、使用しているSDKの製品かもしれません。主キー(ハッシュ)を照会するときには、等価(EQ)しか使用できません。クエリにソートキー(範囲)をチェックする条件が含まれている場合は、他の演算子を使用できます。

"クエリの選択基準テーブルのクエリでは、テーブルのプライマリキー属性のみに条件を設定できます。パーティションキーの名前と値をEQ条件として指定する必要があります。第2の条件、ソートキーを参照する。

出典:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html

0

私の推測では、これは、テーブルのデータスキーマでエラーになることです。あなたがIdのために設定された範囲キーを持っていなければ、それをソートすることができないかもしれません。私はあなたの問題に対する答えはこの文書にあると信じています。

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryingJavaDocumentAPI.html

は、具体的に次の文は際立っている:

の指定オプションパラメータ

クエリメソッドには、いくつかのオプションパラメータをサポートしています。たとえば、 場合によっては、前のクエリの結果を条件を指定して 返信を過去2週間以内に返すことができます。 の条件は、ソートキー条件と呼ばれ、 プライマリキーのソートキーに対して指定したクエリ条件を、 と評価するためです。他のオプション・パラメーターを指定して、照会結果内の項目から属性の特定のリストのみを取得することができます( )。

範囲キーまたはセカンダリインデックスを追加して、それがあなたのIDクエリをサポートするかどうかを確認してください。

関連する問題