如何在 dynamodb 中使用单个键值更新多个项目?

How to update multiple items with single key value in dynamodb?

我正在尝试更新 Dynamodb table 中的项目。但是我遇到了一个问题,如何使用一个键值更新多行。

条件:

set isActive=False where systemId='si11'
+-------------------+----------+----------+
| id(partition_key) | systemId | isActive |
+-------------------+----------+----------+
|               123 | si11     | True     |
|               124 | si11     | True     |
|               125 | si11     | True     |
|               126 | si12     | True     |
|               127 | si12     | True     |
+-------------------+----------+----------+

那么如何使用键 systemId 更新多行?

我有一个解决方案,但这不是最佳做法。

  1. 我将使用 ID(范围键)和 SystemID(哈希键)创建 GSI 索引。
  2. 我将使用关键字 systemId 查询数据。
  3. 然后使用结果用散列键 (id) 更新每一行。

请提出更好的解决方案。

我只有 systemId 作为筛选键,所以我只能用 systemId 更新,我无法为 systemId 创建 GSI 索引,因为它不是唯一的。

您应该为 systemId 创建一个 GSI。

GSI's don't have to be unique;

In a DynamoDB table, each key value must be unique. However, the key values in a global secondary index do not need to be unique.

我会使用 systemId 散列键和可能的 isActive 范围键来执行 GSI。

注意:“排序键”和“范围键”意思相同。

构建 GSI 的许多其他方法,主要取决于 GSI 是否仅用于此访问模式,或者过载以支持多个。

第一次使用 DynamoDB 时,您可能会想带上 SQL 数据库知识。我知道,因为我曾经做过同样的事情。不要那样做! DynamoDB 不是 SQL 数据库,您用于实现 SQL 中的功能的模式在 DynamoDB 中可能不存在。这个用例就是其中之一。

那么如何在 DynamoDB 中更新多个项目的字段?来自 AWS docs:

In DynamoDB, you use the UpdateItem action to modify a single item. (If you want to modify multiple items, you must use multiple UpdateItem operations.)

那么,您可以做什么来实现您的访问模式?一种方法是查询(或扫描)您的 table 以查找要更新的项目。然后发出 seperate updateItem 每个项目一个操作,设置 isActive 为 'false'.

让我们通过描述如何使用二级索引实现这一点来更详细一点。

假设您使用分区键 systemId (GSIPK) 和排序键 isActive (GSISK) 定义二级索引。您的 table 将如下所示:

二级索引看起来像这样(相同的数据,只是不同的视图):

请注意二级索引没有唯一性约束。这使得 super 很容易通过 systemId 获取项目,其中 isActivetrue。从这里开始,您的应用程序可以发出多个 updateItem 操作以将 isActive 字段设置为 false 基础 table 中的项目。

这里超级重要的一点:你不能写入二级索引。

将二级索引视为查看数据的另一种方式。您在 DynamoDB 所谓的“基础 table”上定义了二级索引,Dynamo 负责维护该视图(adding/removing 项)。如果你的基础 table 中有 create/update/delete 项,索引将更新以反映新的现实。