如何通过在发电机中搜索我的 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

如果您想单独使用排序键的值来获取,您有几个选择;

  1. 使用scan查找感兴趣的项目。这并不理想,但如果您无法更改数据模型,则可以作为一种选择。
  2. 创建交换分区键和排序键值的全局二级索引 (GSI)。这种模式称为倒排索引。这将允许您识别具有给定用户名的所有项目。