GSI的AWS DynamoDB Mapper查询为所有非关键属性返回null

时间:2017-05-01 15:29:20

标签: amazon-dynamodb

我有一个映射到DynamoDB表的类,使用DynamoDbMapper查询它,并且遇到以下问题:

当我通过主哈希键查询时,我正确地获取所有值,但是当我通过任一全局二级索引属性查询时,我仍然得到对象,并且正确的记录总是在那里,但是只有填充的字段是主哈希键字段和GSI字段。当我通过GSI查询时,所有其他的总是为空。

这是我的班级:

@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中plainfield的值如何,我的结果总是如下所示:

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

而不是这样:

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

我担心我必须错误地执行查询,但它与我找到的所有成功示例相匹配,并且会将正确的记录作为结果返回。

1 个答案:

答案 0 :(得分:1)

我想GSI是使用ProjectionType KEYS_ONLY创建的。

1)使用以下AWS CLI describe命令检查表的定义,即具体的GSI定义

aws dynamodb describe-table --table-name MyTableName 

2)检查GSI上的Projection是否定义为KEYS_ONLY

 "GlobalSecondaryIndexes": [
     {
         "IndexSizeBytes": 30,
         "IndexName": "indexName",
         "Projection": {
             "ProjectionType": "KEYS_ONLY"
         },

如果定义为&#34; KEYS_ONLY&#34; ,则GSI只有Key属性。您可能需要查询主表以获取可能需要重新创建GSI以投影所有属性的其他属性(或)。