如何对全局二级索引DynamoDB进行排序

时间:2014-06-12 20:54:36

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

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,因为我使用的是自动生成的哈希键,因此无法使用带有Range键的hashkey属性来获取所有可能的结果。我需要获取满足搜索和orderBy名称(GSI)的名称。或者,DynamoDB仅支持orderBy通过hashkey和range键,如Demo?

当我这样做时会得到一个例外,因为&#34;不能在扫描查询中使用orderBy&#34;。

更新: 使用Spring Data DynamoDB,我在名称&#34; description-name-index&#34;中创建了DynamoDB中的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散列和范围对并对它们进行排序。

1 个答案:

答案 0 :(得分:0)

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

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

上述解决方案可行,但它有一个hostspot问题......