我有一个映射到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>
}
我担心我必须错误地执行查询,但它与我找到的所有成功示例相匹配,并且会将正确的记录作为结果返回。
答案 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以投影所有属性的其他属性(或)。