如何从dynamodb中的非键属性中搜索一个项目?

beq87vna  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(266)

我在dynamodb中有一个表,有分区键和排序键。例如,表结构如下所示。

// Primary Keys
id -> PK
name -> SK
Info -> json Formatted Attributes

假设表中有两项,

// Item 1
{
    id: 10245-25-45,
    name: "Name 1",
    info: {
        userId: 1012, // PK
        userName: "ABC", // SK
        type: "type 1",
        date: "2020-01-03 04:05:12"
    }
}

// Item 2
{
    id: 10245-65-70, // pK
    name: "Name 2", // SK
    info: {
        userId: 1013,
        userName: "ABCD",
        type: "type 2",
        date: "2020-01-03 04:10:12"
    }
}

我正在使用 Java 作为语言和使用 DynamoDBMapper 进行积垢处理。所以我知道我可以用 DynamoDBMapper.load() 通过提供 PK 以及 SK ,但我想知道如何通过搜索非键属性来获取数据。例如,我需要通过提供,

// userId, userName, type, data are unique values so it will give only one record if exists
find item by userId;
find item by userId and userName;
find item by type and date;

以上是我的一些访问模式,基本上,我需要在不提供pk和sk的情况下获取数据,而且我不能使用全局二级索引。所以我知道有疑问。但我在想,如果没有这些,有没有办法做我需要的?如果有人能帮我,我真的很感激。提前谢谢。

uelo1irk

uelo1irk1#

这在dynamodb中是不可能做到的,因为数据是分布式的,而全表扫描否定了这个存储选项的使用。
如果数据需要可搜索,则应使用搜索数据库,如果数据量较小,则可以使用sql类型的数据库。
对于一个健壮的解决方案,我将使用ElasticSearch(aws有一个托管的解决方案),在ElasticSearch中只填充可搜索的字段 userID , name , date etc并将文档的id存储在dynamodb中
因此,一个搜索api将查询并检索项目id,然后从dynamodb检索项目

相关问题