【问题标题】:How to sort Global Secondary Index DynamoDB如何对全局二级索引 DynamoDB 进行排序
【发布时间】:2014-08-03 07:54:32
【问题描述】:

Data-REST 和 dynamoDB 并尝试按如下方式对我的 GSI 对象进行排序,是否可以在 dynamoDB 中对 GSI Hashkey 进行排序, 域类

@DynamoDBTable(tableName = "test")
public class Test implements Serializable{

    private static final long serialVersionUID = 1L;

    private String id;
    private String name;
    private String desc;

    @DynamoDBHashKey(attributeName="id")
    @DynamoDBAutoGeneratedKey
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @DynamoDBIndexHashKey(attributeName="name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @DynamoDBAttribute(attributeName="desc")
    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

}

public interface TestRepository extends PagingAndSortingRepository{

    @EnableScan
    @EnableScanCount
    public Page<Test> findByName(@Param("name") String name, Pageable pageable);

    public Page<Test> findByNameOrderByNameAsc(@Param("name") String name, Pageable pageable);

}

是否可以在二级索引上使用 orderBy,因为我使用的是自动生成的 hashkey,因此无法将 hashkey 属性与 Range 键结合起来以获取所有可能的结果。我需要获取满足搜索和 orderBy 名称(GSI)的名称。或者 DynamoDB 只支持 orderBy 通过 hashkey 和 range key 就像在 Demo 中一样?

当我这样做时,出现“无法在扫描查询中使用 orderBy”的异常。

更新: 我正在使用 Spring Data DynamoDB,我在 DynamoDB 中创建了一个名为“description-name-index”的 GSI 哈希和键索引,我喜欢通过哈希键的 findBy 使用范围键对其数据进行排序。这是我的测试代码, 域类

@DynamoDBTable(tableName = "test")
public class Test implements Serializable{

    private static final long serialVersionUID = 1L;

    private String id;
    private String description;
    private String name;

    @DynamoDBIndexHashKey(attributeName="description")
    public String getDescription() {
        return tesId;
    }

    public void setDescription(String description) {
        this.setDescription(description);;
    }

    @DynamoDBIndexRangeKey(attributeName="name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.setName(name);
    }

    @DynamoDBHashKey(attributeName="id")
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

}

并尝试使用findByDescriptionOrderByNameDesc(@Param("decription") String description, Pageable pageable) 获取和排序数据,我也尝试使用@Id 并将索引哈希和范围键放在一个类中,但都是徒劳的。我收到500 Internal Error,但也没有发送任何消息。有什么方法可以使用 GSI 哈希和范围对并对它们进行排序。

【问题讨论】:

    标签: spring amazon-web-services spring-data amazon-dynamodb spring-data-rest


    【解决方案1】:

    您收到的错误消息对我来说很有意义,因为 DynamoDB 中的扫描会以随机顺序返回所有项目(即您不能指定扫描操作的顺序)。

    您想获取按名称排序的所有行。一种天真的方法是创建一个具有单个虚拟哈希键的 GSI,并且范围键是名称。该 GSI 中的所有行都将具有相同的哈希键。这样,GSI 可以按名称对所有行进行排序。

    上述解决方案可行,但存在主机问题...

    【讨论】:

    • 这里有一个 GSI 键来在 java Iterator 中对扫描的输出进行排序或排序是一个不错的选择。我应该去哪一种,哪一种也会有效??
    • 我建议对扫描的输出进行排序,因为它更直接且不易出错
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多