当前使用 DynamoDBmapper 查询 GSI、按排序键排序并获得 return n 个结果的方法?
Current method to query a GSI with DynamoDBmapper, sort on Sort key, and return n results?
当前使用 DynamoDBmapper 和 DynamoDBQueryExpression 查询全局二级索引、按 Sort Index 排序和 return 前 n 个结果的方法是什么?
此处显示的首次尝试解决方案:
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query
但是,DynamoDBQueryExpression 不再存在 withKeyConditionExpression。接下来,我尝试了此处显示的示例:
它使用 setHashKeyValues,但出现以下错误:com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMappingException: Public,零参数哈希键 属性 必须使用接口 com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey
如果我进行扫描,我能够提取结果,所以我认为权限是正确的:
Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":val1", new AttributeValue().withS(Leaderboard));
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
.withFilterExpression("Leaderboard = :val1") // and Ranking <= :val2")
.withExpressionAttributeValues(eav);
DynamoDBmapper 对象如下所示。我没有包含主 table 中的任何主键属性,只是这个子集。
@DynamoDBTable(tableName = "Users")
public class DynamoLeaderboard implements Serializable {
private String leaderboard;
private String userName;
private int ranking;
public DynamoLeaderboard() {}
@DynamoDBIndexHashKey(globalSecondaryIndexName = "Leaderboard-Ranking-index", attributeName = "Leaderboard")
public String getLeaderboard() {
return leaderboard;
}
public void setLeaderboard(final String leaderboard) {
this.leaderboard = leaderboard;
}
@DynamoDBIndexRangeKey(globalSecondaryIndexName = "Leaderboard-Ranking-index", attributeName = "Ranking")
public int getRanking() {
return ranking;
}
public void setRanking(int ranking) {
this.ranking = ranking;
}
@DynamoDBAttribute(attributeName = "UserName")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
然后调用查询:
final DynamoLeaderboard tmpLeaderboard = new DynamoLeaderboard();
tmpLeaderboard.setLeaderboard("0");
Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":val1", new AttributeValue().withS("0"));
DynamoDBQueryExpression<DynamoLeaderboard> queryExpression = new DynamoDBQueryExpression<DynamoLeaderboard>();
queryExpression.withIndexName("Leaderboard-index");
queryExpression.setHashKeyValues(tmpLeaderboard);
queryExpression.withConsistentRead(false);
scanResult = mapper.query(DynamoLeaderboard.class, queryExpression);
对导致零属性 哈希键异常的原因发表评论?它与设置 table 主哈希键与 GSI 哈希键有关吗?
关于在 GSI 上执行查询的当前正确方法的建议?
非常感谢!
您需要将主要 table 的关键属性添加到您的模型中。 DynamoDBMapper 正在犹豫,因为 @DynamoDBTable
注释 class 没有 @DynamoDBHashKey
属性。
或者,您可以尝试将 @DynamoDBTable
更改为 @DynamoDBDocument
,但我不太确定是否可行。
这是我的方式:
final Example example = new Example();
example.setID(senderAcid);
final DynamoDBQueryExpression<Example> queryExpression = new DynamoDBQueryExpression<>();
queryExpression.withIndexName("SomeGSIndex")
.withConsistentRead(false)
.withProjectionExpression("id,omeOtherData,someOtherFieldName")
.withHashKeyValues(example);
------------ SortKey 的重要条件
queryExpression.withRangeKeyCondition("sortKeyField",
new Condition()
.withComparisonOperator(ComparisonOperator.EQ)
.withAttributeValueList(new AttributeValue().withS(sortKeyValue)));
--------终于
mapper.query(Example.class, query);
当前使用 DynamoDBmapper 和 DynamoDBQueryExpression 查询全局二级索引、按 Sort Index 排序和 return 前 n 个结果的方法是什么?
此处显示的首次尝试解决方案: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query
但是,DynamoDBQueryExpression 不再存在 withKeyConditionExpression。接下来,我尝试了此处显示的示例:
它使用 setHashKeyValues,但出现以下错误:com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMappingException: Public,零参数哈希键 属性 必须使用接口 com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey
如果我进行扫描,我能够提取结果,所以我认为权限是正确的:
Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":val1", new AttributeValue().withS(Leaderboard));
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
.withFilterExpression("Leaderboard = :val1") // and Ranking <= :val2")
.withExpressionAttributeValues(eav);
DynamoDBmapper 对象如下所示。我没有包含主 table 中的任何主键属性,只是这个子集。
@DynamoDBTable(tableName = "Users")
public class DynamoLeaderboard implements Serializable {
private String leaderboard;
private String userName;
private int ranking;
public DynamoLeaderboard() {}
@DynamoDBIndexHashKey(globalSecondaryIndexName = "Leaderboard-Ranking-index", attributeName = "Leaderboard")
public String getLeaderboard() {
return leaderboard;
}
public void setLeaderboard(final String leaderboard) {
this.leaderboard = leaderboard;
}
@DynamoDBIndexRangeKey(globalSecondaryIndexName = "Leaderboard-Ranking-index", attributeName = "Ranking")
public int getRanking() {
return ranking;
}
public void setRanking(int ranking) {
this.ranking = ranking;
}
@DynamoDBAttribute(attributeName = "UserName")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
然后调用查询:
final DynamoLeaderboard tmpLeaderboard = new DynamoLeaderboard();
tmpLeaderboard.setLeaderboard("0");
Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":val1", new AttributeValue().withS("0"));
DynamoDBQueryExpression<DynamoLeaderboard> queryExpression = new DynamoDBQueryExpression<DynamoLeaderboard>();
queryExpression.withIndexName("Leaderboard-index");
queryExpression.setHashKeyValues(tmpLeaderboard);
queryExpression.withConsistentRead(false);
scanResult = mapper.query(DynamoLeaderboard.class, queryExpression);
对导致零属性 哈希键异常的原因发表评论?它与设置 table 主哈希键与 GSI 哈希键有关吗?
关于在 GSI 上执行查询的当前正确方法的建议?
非常感谢!
您需要将主要 table 的关键属性添加到您的模型中。 DynamoDBMapper 正在犹豫,因为 @DynamoDBTable
注释 class 没有 @DynamoDBHashKey
属性。
或者,您可以尝试将 @DynamoDBTable
更改为 @DynamoDBDocument
,但我不太确定是否可行。
这是我的方式:
final Example example = new Example();
example.setID(senderAcid);
final DynamoDBQueryExpression<Example> queryExpression = new DynamoDBQueryExpression<>();
queryExpression.withIndexName("SomeGSIndex")
.withConsistentRead(false)
.withProjectionExpression("id,omeOtherData,someOtherFieldName")
.withHashKeyValues(example);
------------ SortKey 的重要条件
queryExpression.withRangeKeyCondition("sortKeyField",
new Condition()
.withComparisonOperator(ComparisonOperator.EQ)
.withAttributeValueList(new AttributeValue().withS(sortKeyValue)));
--------终于
mapper.query(Example.class, query);