【问题标题】:DynamoDBMapper - DynamoDBDocument and local secondary indexesDynamoDBMapper - DynamoDBDocument 和本地二级索引
【发布时间】:2018-02-12 17:20:56
【问题描述】:

我使用的是 DynamoDB SDK 1.11.185 版本。我有一个客户端实体通过 DynamoDBMapper 注释映射到客户端 DynamoDB 表。其中一个属性包含嵌套值(参见下面的代码示例)。我想从 Options 类中向 zone 属性添加一个本地二级索引。一旦我想保存一个对象,我就从这个类中得到一个空指针异常

com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel

第 415 行。看起来像是库中的错误。

P.D.如果我通过 Client 实体的 clientId 属性生成索引,一切正常。

@DynamoDBTable(tableName="Clients")
public class Client {

    private String id;
    private String clientId;
    private Date created;
    private Options options;

    public Client() {
    }

    public Client(String id, String clientId, Options options) {
        this.id = id;
        this.clientId = clientId;
        this.options = options;
        this.created = new Date();
    }

    @DynamoDBHashKey
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }

    @DynamoDBAttribute
    public String getClientId() { return clientId; }
    public void setClientId(String clientId) { this.clientId = clientId; }

    @DynamoDBAttribute
    public Options getOptions() { return options; }
    public void setOptions(Options options) { this.options = options; }

    @DynamoDBRangeKey
    public Date getCreated() { return created; }
    public void setCreated(Date created) { this.created = created; }
}

@DynamoDBDocument
public class Options {

    private String zone;

    public Options() {
    }

    public Options(String zone) {
        this.zone = zone;
    }

    @DynamoDBIndexRangeKey(localSecondaryIndexName = "zone-index")
    public String getZone() { return zone; }
    public void setZone(String zone) { this.zone = zone; }

}

****************************** 已编辑 ****************** *******

@Raniz 的正确答案和 Indexing on nested field

虽然可以使用 JSON 属性来完成: DynamoDB create index on map or list type

【问题讨论】:

    标签: amazon-dynamodb aws-sdk


    【解决方案1】:

    您不能在索引的键架构中使用嵌套属性。

    我假设您已经在架构中使用 options.zone 创建了索引,这意味着 DynamoDB 期望具有该确切名称的顶级属性 - 即名为 options 的属性。 zone 而不是嵌套在 options 属性下的名为 zone 的属性。

    摘自here

    • 索引的键模式。索引键模式中的每个属性 必须是字符串、数字或二进制类型的顶级属性。其他 不允许使用数据类型,包括文档和集合。键架构的其他要求取决于索引的类型:

      • 对于全局二级索引,分区键可以是基表的任何标量属性。排序键是可选的,也可以是 基表的任何标量属性。

      • 对于本地二级索引,分区键必须与基表的分区键相同,排序键必须是非键 基表属性。

    要在索引架构中使用 zone,您需要移动或复制它,以便在顶层可用。实现这一点的最简单方法可能是向Client 添加一个返回options.zone 的getter:

    @DynamoDBIndexRangeKey(localSecondaryIndexName = "zone-index")
    public String getZone() {
        if (options != null) {
            return options.getZone();
        }
        return null;
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    相关资源
    最近更新 更多