如何通过在发电机中搜索我的 hash_key 来调出项目列表?
How can I bring up the list of items by searching through my hash_key, in dynamo?
我在 dynamo
中有一个 table,它有 hash_key
: Name
(String
) 和另外 3 个全局索引。
例如,我需要搜索并带来我的 Name
== myNameToSearch
的项目列表。
但是我在使用 getItem 获取时遇到了问题。我在发电机中有物品。
我面临这个错误:
The provided key element does not match the schema (Service: DynamoDb, Status Code: 400
但是我的hash_key是正确的...
这是我的 Class DynamoDbConfig:
@Getter
@Singleton
@Slf4j
public class DynamoDBConfig {
private DynamoDbTable<MyModel> table;
public DynamoDBConfig(Config config) {
DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
.dynamoDbClient(DynamoDbClient.builder().build())
.build();
String tableName = config.getValue("myDynamoTable");
table = enhancedClient.table(tableName, TableSchema.fromBean(MyModel.class));
}
}
我的 class 在 dynamo 中搜索:
@Service
@Singleton
@RequiredArgsConstructor
public class BringFromDynamo {
private final DynamoDBConfig config;
protected Void doExecute() {
config.getTable().getItem(Key.builder().partitionValue("myNameToSearch").build()); //error
}
}
我的模特:
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@DynamoDbBean
@EqualsAndHashCode
public class MyModel implements Serializable {
public static final String MYNAME = "Name";
public static final String ANOTHER_FIELD_GLOBAL_INDEX = "anotherField";
@JsonProperty(MYNAME)
@Getter(onMethod_ = {@DynamoDbAttribute(MYNAME), @DynamoDbPartitionKey})
private String myName;
@JsonProperty(ANOTHER_FIELD_GLOBAL_INDEX)
@Getter(onMethod_ = {@DynamoDbAttribute(ANOTHER_FIELD_GLOBAL_INDEX)})
private LocalDate anotherField;
}
您可能误解了主键在 DynamoDB 中的工作方式。
听起来你有一个复合主键,这意味着你同时有一个分区键和一个排序键。 getItem
操作通过完整主键(分区键 和 排序键)获取项目来工作。您不能单独使用 getItem 通过排序键获取数据,这就是 DynamoDB 错误告诉您的内容
The provided key element does not match the schema
如果您想单独使用排序键的值来获取,您有几个选择;
- 使用
scan
查找感兴趣的项目。这并不理想,但如果您无法更改数据模型,则可以作为一种选择。
- 创建交换分区键和排序键值的全局二级索引 (GSI)。这种模式称为倒排索引。这将允许您识别具有给定用户名的所有项目。
我在 dynamo
中有一个 table,它有 hash_key
: Name
(String
) 和另外 3 个全局索引。
例如,我需要搜索并带来我的 Name
== myNameToSearch
的项目列表。
但是我在使用 getItem 获取时遇到了问题。我在发电机中有物品。
我面临这个错误:
The provided key element does not match the schema (Service: DynamoDb, Status Code: 400
但是我的hash_key是正确的...
这是我的 Class DynamoDbConfig:
@Getter
@Singleton
@Slf4j
public class DynamoDBConfig {
private DynamoDbTable<MyModel> table;
public DynamoDBConfig(Config config) {
DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
.dynamoDbClient(DynamoDbClient.builder().build())
.build();
String tableName = config.getValue("myDynamoTable");
table = enhancedClient.table(tableName, TableSchema.fromBean(MyModel.class));
}
}
我的 class 在 dynamo 中搜索:
@Service
@Singleton
@RequiredArgsConstructor
public class BringFromDynamo {
private final DynamoDBConfig config;
protected Void doExecute() {
config.getTable().getItem(Key.builder().partitionValue("myNameToSearch").build()); //error
}
}
我的模特:
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@DynamoDbBean
@EqualsAndHashCode
public class MyModel implements Serializable {
public static final String MYNAME = "Name";
public static final String ANOTHER_FIELD_GLOBAL_INDEX = "anotherField";
@JsonProperty(MYNAME)
@Getter(onMethod_ = {@DynamoDbAttribute(MYNAME), @DynamoDbPartitionKey})
private String myName;
@JsonProperty(ANOTHER_FIELD_GLOBAL_INDEX)
@Getter(onMethod_ = {@DynamoDbAttribute(ANOTHER_FIELD_GLOBAL_INDEX)})
private LocalDate anotherField;
}
您可能误解了主键在 DynamoDB 中的工作方式。
听起来你有一个复合主键,这意味着你同时有一个分区键和一个排序键。 getItem
操作通过完整主键(分区键 和 排序键)获取项目来工作。您不能单独使用 getItem 通过排序键获取数据,这就是 DynamoDB 错误告诉您的内容
The provided key element does not match the schema
如果您想单独使用排序键的值来获取,您有几个选择;
- 使用
scan
查找感兴趣的项目。这并不理想,但如果您无法更改数据模型,则可以作为一种选择。 - 创建交换分区键和排序键值的全局二级索引 (GSI)。这种模式称为倒排索引。这将允许您识别具有给定用户名的所有项目。