标签: amazon-dynamodb-index

如何在 DynamoDB 中实现按项目的任意属性排序

我的 DynamoDB 结构如下。

  1. 我有患者,其患者信息存储在其文档中。
  2. 我有索赔,索赔信息存储在其文档中。
  3. 我的付款信息存储在其文档中。
  4. 每项索赔都属于患者。患者可以提出一项或多项索赔。
  5. 每一笔付款都属于患者。患者可以有一次或多次付款。

我只创建了一张 DynamoDB 表,因为所有 aws dynamodb 文档都表明如果可能的话仅使用一张表是最佳解决方案。所以我最终得到以下结果: 基表

在此表中,ID 是分区键,EntryType 是排序键。每项索赔和付款都有其所有者。我的访问模式如下:

  1. 列出数据库中的所有患者,并按创建日期对患者进行分页。
  2. 通过分页列出数据库中的所有声明,并按创建日期排序。
  3. 列出数据库中的所有付款并分页,付款按创建日期排序。
  4. 列出特定患者的索赔。
  5. 列出特定患者的付款情况。

我可以通过两个全局二级索引来实现这些。我可以使用 GSI(以 EntryType 作为分区键、以 CreationDate 作为排序键)列出按创建日期排序的患者、索赔和付款。此外,我还可以使用另一个具有 EntryType 分区键和 OwnerID 排序键的 GSI 来列出患者的索赔和付款。

我的问题是这种方法只能对创建日期进行排序。我的患者和索赔有更多的属性(每个属性大约 25 个),我还需要根据每个属性对它们进行排序。但 Amazon DynamoDB 有一个限制,即每个表最多可以有 20 个 GSI。因此,我尝试动态创建 GSI(根据请求动态创建),但效率也非常低,因为它将项目复制到另一个分区来创建 GSI(据我所知)。那么,按患者姓名、按索赔说明以及他们拥有的任何其他字段对患者进行排序的最佳解决方案是什么?

amazon-dynamodb dynamodb-queries amazon-dynamodb-index

2
推荐指数
1
解决办法
8199
查看次数

使用毫秒时间戳作为 DynamodDb 中的全局二级索引进行范围查询?

我们有一个 Dynamodb 表,Events其中包含大约 5000 万条记录,如下所示:

{
 "id": "1yp3Or0KrPUBIC",
 "event_time": 1632934672534,
 "attr1" : 1,
 "attr2" : 2,
 "attr3" : 3,
 ...
 "attrN" : N,
}
Run Code Online (Sandbox Code Playgroud)

Partition Key=id并且没有Sort Keyid除了(全局唯一)和 之外,可以有数量可变的属性event_time,这是必需的。

此设置非常适合获取,id但现在我们希望有效地查询event_time并提取在该范围内匹配的记录的所有属性(可能是一百万或两个项目)。例如,标准将等于WHERE event_date between 1632934671000 and 1632934672000

在不更改任何现有数据或通过外部过程转换数据的情况下,是否可以使用event_date和投影允许范围查询的所有属性来创建全局二级索引?根据我对 DynamoDB 的理解,这是不可能的,但也许还有我忽略的另一种配置。

提前致谢。

amazon-dynamodb dynamodb-queries amazon-dynamodb-index

2
推荐指数
1
解决办法
2012
查看次数

DynamoDbException:给定查询的分解读取操作过多

使用如下所示的 PartiQL 查询时:

SELECT * FROM my_table WHERE my_field IN [1, 2, 3...]

我收到此错误,我在 Google 中找不到该错误,并且没有告诉我有关如何解决该问题的任何信息:

DynamoDbException: Too many decomposed read operations for a given query

我需要做哪些不同的事情?

amazon-dynamodb dynamodb-queries amazon-dynamodb-index

2
推荐指数
1
解决办法
1163
查看次数

查询 DynamoDB 表以获取标志值为 true 的所有项目

我有一个 DDB 表,其中哈希键作为 id(字符串),排序键作为标志(布尔值)。我想获取表中标志值为 true 的所有项目。我尚未设置任何 GSI 或 LSI,但如果需要,我可以创建它们。

模式

{
  "id": {
    "S": "<Some ID>"
  },
  "flag": {
    "B": "<true/false>"
  }
}
Run Code Online (Sandbox Code Playgroud)

amazon-dynamodb dynamodb-queries amazon-dynamodb-index

1
推荐指数
1
解决办法
1317
查看次数

根据 GSI 更新 Dynamo DB 列

我创建了一个表 TEST,它有 4 列:

column1:范围键

column2:排序键

第 3 列:GSI

第4列:普通属性

现在我想根据 GSI 值更新 column4 的值。我尝试使用以下代码,但仅当我同时传递范围和排序键时才有效。在我更新时的用例中,我只有 GSI 的值而不是范围/排序键。

Map<String, AttributeValue> key = new HashMap<>();
key.put(“column1”, new AttributeValue().withS(column1Value));
key.put(“column2”, new AttributeValue().withS(column2Value));
Map<String, AttributeValue> attributeValues = new HashMap<>();

attributeValues.put(“column4”, new AttributeValue().withS(column4Value));
attributeValues.put(“column3”, new AttributeValue().withS(column3Value));

UpdateItemRequest updateItemRequest = new UpdateItemRequest()
                .withTableName(emailsTableName)
                .withKey(key)
                .withUpdateExpression(“set column4 = :column4”)
                .withConditionExpression(“column3 = :column3”)
                .withExpressionAttributeValues(attributeValues);
UpdateItemResult updateItemResult = dynamoDBClient.updateItem(updateItemRequest);
Run Code Online (Sandbox Code Playgroud)

这是否可以仅基于 GSI 更新 Dynamo DB 的列?

java amazon-web-services amazon-dynamodb amazon-dynamodb-index

0
推荐指数
1
解决办法
521
查看次数

如何使用 Terraform 将本地二级索引添加到现有 DynamoDB 表而不替换它?

我们遵循 AWS DynamoDB 的单表架构,并使用单个表来存储所有实体。

我们有在我们这里注册车辆的用户,表结构如下:

用户身份 实体ID 实体类型
1 1
1 2 自行车

和关键属性:

  • partition_key=user_id
  • sort_key=entity_id

现在,我们需要仅获取汽车、自行车或任何其他车辆,user_id我想为其添加本地二级索引,并使用现有分区键(以实体类型作为排序键)。

在应用此更改时,它正在尝试重新创建表。

由于现有表中已有数据,有什么方法可以避免重新创建表吗?

amazon-web-services amazon-dynamodb terraform amazon-dynamodb-index

0
推荐指数
1
解决办法
164
查看次数