我在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的情况下获取数据,而且我不能使用全局二级索引。所以我知道有疑问。但我在想,如果没有这些,有没有办法做我需要的?如果有人能帮我,我真的很感激。提前谢谢。
1条答案
按热度按时间uelo1irk1#
这在dynamodb中是不可能做到的,因为数据是分布式的,而全表扫描否定了这个存储选项的使用。
如果数据需要可搜索,则应使用搜索数据库,如果数据量较小,则可以使用sql类型的数据库。
对于一个健壮的解决方案,我将使用ElasticSearch(aws有一个托管的解决方案),在ElasticSearch中只填充可搜索的字段
userID
,name
,date
etc并将文档的id存储在dynamodb中因此,一个搜索api将查询并检索项目id,然后从dynamodb检索项目