DynamoDBMapper - DynamoDBDocument和本地二级索引

时间:2017-09-04 12:56:11

标签: amazon-dynamodb aws-sdk

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

得到一个空指针异常

com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel

第415行。看起来是图书馆的一个错误。

Pd积。如果我从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

1 个答案:

答案 0 :(得分:1)

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

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

摘自here

  
      
  • 索引的关键架构。索引键架构中的每个属性   必须是String,Number或Binary类型的顶级属性。其他   不允许使用数据类型,包括文档和集合。密钥模式的其他要求取决于索引的类型:

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

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

    •   
  •   

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

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