2017-09-04 44 views
1

我正在使用DynamoDB SDK 1.11.185版本。我有一個Client實體通過DynamoDBMapper註釋映射到客戶端DynamoDB表。其中一個屬性包含嵌套值(請參閱下面的代碼示例)。我想從Options類中添加一個本地二級索引到zone屬性。有一次,我要保存一個對象,我從這個類DynamoDBMapper - DynamoDBDocument和本地二級索引

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

回答

1

不能使用嵌套屬性索引的關鍵模式。

我想你已經創建的索引與options.zone中,這意味着DynamoDB期待與確切名稱的頂級屬性的模式 - 即名爲options.zone,而不是一個屬性的屬性名爲區域嵌套在選項屬性下。

摘自here

  • 該指數的主要架構。索引鍵架構 中的每個屬性都必須是String,Number或Binary類型的頂級屬性。其他 數據類型,包括文檔和集合,是不允許的。關鍵架構的其他要求取決於索引類型:

    • 對於全局二級索引,分區鍵可以是基表的任何標量屬性。排序鍵是可選的,它也可以是基表的任何標量屬性。

    • 對於本地二級索引,分區鍵必須與基表的分區鍵相同,排序鍵必須是非鍵 基表屬性。

要使用在你的索引架構,您需要移動或複製它,所以它是可利用的在頂層。解決這個問題的最簡單的方法很可能是一個getter添加到Client返回options.zone

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

感謝@Raniz回答。其實我只是發現我的問題在這裏回答https://stackoverflow.com/questions/30439107/indexing-on-nested-field。我會嘗試使用你提出的方法並回到你身邊。標記它是正確的,但。 – alvgarvilla