我正在从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);
但是我得到AmazonServiceExceptioncom.amazonaws.AmazonServiceException: Query key condition not supported (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: XXXXXXXXXXXXXXXXXXXXXXXXXXX
。
请帮。
我对第一段代码的工作感到有点惊讶,但它可能是正在使用的SDK的产品。在查询主键(哈希)时只能使用equals (EQ)。当查询包含根据排序键(范围)进行检查的条件时,可以使用其他操作符。
"查询的选择标准。对于表上的查询,只能对表的主键属性设置条件。您必须提供分区键名和值作为EQ条件。您可以选择性地提供第二个条件,引用排序键。"
来源:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html
我猜这可能是表的数据模式中的错误。如果没有为Id建立范围键,则可能无法对其进行排序。我相信你的问题的答案就在这份文件里。
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryingJavaDocumentAPI.html特别是下面的语句:
指定可选参数
该查询方法支持多个可选参数。例如,您可以选择将上述查询的结果缩小到通过指定条件返回过去两周内的答复。的条件称为排序键条件,因为DynamoDB计算的排序键指定的查询条件主键。您可以指定要检索的其他可选参数仅查询结果项的特定属性列表。
也许可以尝试添加一个范围键或二级索引,看看是否会支持你的id查询?