如何通过从 DynamoDB 中的非键属性搜索来获取一项?

问题描述

我在 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 进行 CRUD 操作。所以我知道我可以通过提供 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 的情况下获取数据,而且我不能使用全局二级索引。所以我知道有查询。但我想知道没有那个有什么方法可以做我需要的吗?如果有人能帮助我,我真的很感激。提前致谢。

解决方法

这在 dynamoDB 中是不可能的,因为数据的分布式特性和全表扫描否定了这个存储选项的使用。

如果数据需要可搜索,应该使用搜索DB,如果数据量很小,可以使用SQL类型的DB。

对于一个强大的解决方案,我会使用弹性搜索(AWS 有一个托管解决方案),在弹性中只填充可搜索的字段,在你的情况下 userID,name,date等并将文档的 id 存储在 dynamoDB 中

所以一个搜索API,会查询elastic 检索项目id,然后从dynamoDB 检索项目

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...