当前位置: 首页 > 知识库问答 >
问题:

使用DynamoDBmapper查询GSI的当前方法,按排序键排序,并返回n个结果?

姚骁
2023-03-14

当前使用DynamoDBmapper和DynamoDBQueryExpression查询全局辅助索引、按排序索引排序并返回前n个结果的方法是什么?

                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);
@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);

关于在GSI上执行查询的当前正确方式的建议?

非常感谢!

共有1个答案

蓬高谊
2023-03-14

您需要将主表的关键属性添加到您的模型中。由于@DynamOdbTable注释类没有@DynamOdbHashKey属性,DynamoDBMapper停滞不前。

或者,可以尝试将@dynamodbtable更改为@dynamodbdocument,但我不太确定这是否可行。

 类似资料:
  • 我一直在阅读关于使用GSI的最佳方式的问题,这一个DynamoDB:在查询中使用全球二级索引接近我所需要的,但我仍然有几个问题。 我需要进行以下三类查询: 根据我的理解,创建一个基于product_name的GSI将服务于所有三个目的。我想了解的是,在排序键中再添加2个带有launch_year和manufacture的GSI会加快查询2和3的速度吗?sort key的唯一目的是返回已排序的数据,

  • 查询结果的排序 当发送查询命令到ElasticSearch中,返回的文档集合默认会按照计算出来的文档打分排序(已经在本章的 Lucene的默认打分算法 一节中讲到)。这通常是用户希望的:结果集中的第一个文档就是查询命令想要的文档。然而,有的时候我们希望改变这种排序。这很简单,因为我们已经用过了单个字符串类型的数据。让我们看如下的样例: { "query" : { "terms" : { "t

  • 问题内容: 假设我在Redis中有这些对: 键始终是十进制数字。当提供一个数字时,我想在两个方向上获得最接近数字的两个键。 例如,如果我搜索的邻居,则结果集应具有: 这可能吗?我还是Redis的新手,感谢您的帮助。 问题答案: 是和不是同一时间。 为什么是? 唯一的redis数据类型-SORTED SET允许您获取基于十进制的值范围。因此,使用ZRANGEBYSCORE,您可以按分数范围获取值。

  • 按查询排序返回不同的排序,为什么? 结果: 为什么?

  • 问题内容: 在Python 3中,使用多个键按字典顺序对对象列表进行排序非常容易。例如: 该参数使您可以指定是升序还是降序。但是,如果要按多个键进行排序,但是要对第一个键使用降序排序,而对第二个键使用升序排序,该怎么办? 例如,假设我们有一个具有两个属性的对象,而,其中an和is是。我们希望通过梳理这些对象的名单在 递减 顺序(使之与点的数量最多的对象是第一位的),但与同等数量的对象,我们要排序这

  • 问题如下: 由一个固定数量的n个端到端连接的段组成的列表,每个段已经按升序排列。 我考虑过使用mergesort,基本情况是,如果等于n,那么返回并合并它们,因为我们已经知道它们是排序的,但是如果我有3个段,它将不起作用,因为我除以2,你不能将3个段平均分成两部分。 另一种方法类似于合并排序。所以我对每个段使用n个堆栈,如果L[i],我们可以识别它 如果你有主意的话,伪代码会很好。 编辑: 一个例