【问题标题】:com.amazonaws.AmazonServiceException: Query key condition not supportedcom.amazonaws.AmazonServiceException:不支持查询键条件
【发布时间】:2017-04-13 07:19:18
【问题描述】:

我正在从 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 =“1”的项目。所以我把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

请帮忙。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      特别是下面的陈述:

      指定可选参数

      查询方法支持几个可选参数。例如, 您可以选择将前面查询的结果缩小到 通过指定条件返回过去两周内的回复。这 条件称为排序键条件,因为 DynamoDB 评估 您针对排序键指定的查询条件 首要的关键。您可以指定其他可选参数来检索 仅来自查询结果中项目的特定属性列表。

      也许尝试添加范围键或二级索引,看看是否支持您的 id 查询?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-20
        • 2017-04-01
        相关资源
        最近更新 更多