com.amazonaws.AmazonServiceException:不支持查询键条件

时间:2016-06-30 14:08:16

标签: android amazon-web-services amazon-dynamodb

我从AWS DynamoDB表中获取数据。使用下面的代码,我可以使用此代码从表中获取单个项目。

    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 =&#34; 1&#34;的项目。所以我将ComparisonOperator.GE更改为ComparisonOperator.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 个答案:

答案 0 :(得分:3)

我对第一段代码有点惊讶,但它可能是正在使用的SDK的产品。查询主键(哈希)时,只能使用equals(EQ)。当查询包含检查排序键(范围)的条件时,您可以使用其他运算符。

“查询的选择条件。对于表上的查询,您只能对表主键属性有条件。您必须提供分区键名称和值作为EQ条件。您可以选择提供第二个条件,指的是排序键。“

来源:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html

答案 1 :(得分:0)

我的猜测是,这将是表格数据模式中的错误。如果您没有为Id建立范围键,则可能无法对其进行排序。我相信您的问题的答案位于本文档中。

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

具体而言,下面的陈述突出:

  
    

指定可选参数

  
     

查询方法支持几个可选参数。例如,   您可以选择将前一个查询的结果缩小到   通过指定条件在过去两周内回复回复。该   条件称为排序键条件,因为DynamoDB会进行求值   您针对的排序键指定的查询条件   首要的关键。您可以指定要检索的其他可选参数   只有查询结果中项目的特定属性列表。

也许尝试添加范围键或辅助索引,看看是否支持您的ID查询?