gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:19:00 25 4
gpt4 key购买 nike

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

当我通过主哈希键查询时,我可以正确地返回所有值,但是当我通过任一全局二级索引属性进行查询时,我仍然可以返回对象,而且正确的记录始终存在,但是只有填充的字段是主哈希键字段和 GSI 字段。当我通过 GSI 查询时,所有其他的始终为 null。

这是我的类(class):

@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>
}

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

最佳答案

我猜 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"
},

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

关于amazon-dynamodb - GSI 的 AWS DynamoDB Mapper 查询为所有非键属性返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43721688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com