我从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
。
请帮助。
答案 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查询?