2017-05-01 26 views
1

私はそれを照会するDynamoDbMapperを使用して、DynamoDBのテーブルにマップされたクラスを持って、そして次の問題が生じていますのためにnullを返しますハッシュキー、私はすべての値を正しく取得しますが、グローバルセカンダリインデックス属性のいずれかでクエリを実行しても、オブジェクトは戻ってきますが、正しいレコードは常に存在しますが、キーフィールド、およびGSIフィールドが含まれます。私がGSIで照会すると、他のものは常にヌルです。ここでAWS DynamoDBのマッパーのクエリは、すべての非キー属性

が私のクラスである:

@DynamoDBTable(tableName="MyTableName") 
public class MyClass { 

    private String id; 
    private String gsiField; 
    private String plainField; 

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

    @DynamoDBIndexHashKey(attributeName="GsiField", globalSecondaryIndexName = "GsiFieldIndex") 
    public String getGsiField() { 
     return gsiField; 
    } 
    public void setGsiField(String gsiField) { 
     this.gsiField = gsiField; 
    } 

    @DynamoDBAttribute(attributeName = "PlainField") 
    public String getPlainField() { 
     return plainField; 
    } 
    public void setPlainField(String plainField) { 
     this.plainField = plainField; 
    } 
} 

そして、ここではGsiFieldで検索クエリです:

public List<MyClass> getListForGsiField(String gsiFieldValue){ 
    List<MyClass> itemList = null; 

    try{ 
     MyClass partitionKey = new MyClass(); 
     partitionKey.setGsiField(gsiFieldValue); 
     DynamoDBQueryExpression<MyClass> queryExpression = new DynamoDBQueryExpression<>(); 
     queryExpression.setHashKeyValues(partitionKey); 
     queryExpression.setIndexName("GsiFieldIndex"); 
     queryExpression.setConsistentRead(false); 

     itemList = mapper.query(MyClass.class, queryExpression); 
    } catch (Exception e){ 
     log.error(String.format("Exception querying datasource for gsiField %s", gsiFieldValue), e); 
     throw e; 
    } 

    return itemList; 
} 

かかわらず、DynamoDBの中プレーンフィールドの値の、私の結果は、常にこのようになります。代わりに、このようなの

{ 
    "Id": "123451234512345", 
    "GsiField": "<gsiFieldValue>", 
    "PlainField": null 
} 

{ 
    "Id": "123451234512345", 
    "GsiField": "<gsiFieldValue>", 
    "PlainField": "<the_value_in_the_database> 
} 

私はクエリを間違って実行する必要がありますが、見つかったすべての成功例と一致し、結果として正しいレコードを返します。

答えて

0

ProjectionTypeとGSIはKEYS_ONLYで作成されていると思います。

1)

aws dynamodb describe-table --table-name MyTableName 

2)それはKEYS_ONLY

"GlobalSecondaryIndexes": [ 
    { 
     "IndexSizeBytes": 30, 
     "IndexName": "indexName", 
     "Projection": { 
      "ProjectionType": "KEYS_ONLY" 
     }, 
として定義されているかどうGSIの Projectionをチェックすなわち、特にテーブルの定義GSIの定義を確認するには、コマンドを記述AWS CLIの下に使用します

"KEYS_ONLY"と定義されている場合、GSIにはKey属性のみがあります。他の属性を取得するためにメインテーブルを照会する必要があります(または)すべての属性を投影するためにGSIを再作成する必要があるかもしれません。

+0

これはまさに問題でした。ありがとうございました! 「ProjectionType」のインデックスに切り替えると、「ALL」と表示され、期待どおりに動作するようになりました。ありがとうございました! – codeblue0000ff

関連する問題