如何在 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
更新多行?
我有一个解决方案,但这不是最佳做法。
- 我将使用
ID
(范围键)和 SystemID
(哈希键)创建 GSI 索引。
- 我将使用关键字 systemId 查询数据。
- 然后使用结果用散列键 (
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
获取项目,其中 isActive
是 true
。从这里开始,您的应用程序可以发出多个 updateItem
操作以将 isActive
字段设置为 false
基础 table 中的项目。
这里超级重要的一点:你不能写入二级索引。
将二级索引视为查看数据的另一种方式。您在 DynamoDB 所谓的“基础 table”上定义了二级索引,Dynamo 负责维护该视图(adding/removing 项)。如果你的基础 table 中有 create/update/delete 项,索引将更新以反映新的现实。
我正在尝试更新 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
更新多行?
我有一个解决方案,但这不是最佳做法。
- 我将使用
ID
(范围键)和SystemID
(哈希键)创建 GSI 索引。 - 我将使用关键字 systemId 查询数据。
- 然后使用结果用散列键 (
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
获取项目,其中 isActive
是 true
。从这里开始,您的应用程序可以发出多个 updateItem
操作以将 isActive
字段设置为 false
基础 table 中的项目。
这里超级重要的一点:你不能写入二级索引。
将二级索引视为查看数据的另一种方式。您在 DynamoDB 所谓的“基础 table”上定义了二级索引,Dynamo 负责维护该视图(adding/removing 项)。如果你的基础 table 中有 create/update/delete 项,索引将更新以反映新的现实。