DynamoDB:仅更新地图条目的键
DynamoDB: Update just the key of a map entry
如何以编程方式更改仅 DynamoDB 中嵌套映射的键而不同时更改该映射的值?
例如,请参阅下面我创建的 game
table。我想将名称“Sam”更改为“Steve”,而不必向地图添加新的 key/value 对。在 GUI 中,我可以更改名称并单击保存,但我找不到如何以编程方式执行此操作的示例。
是否可以只更改密钥?或者我是否需要创建一个新密钥“Steve”,将“Sam”的内容复制到“Steve”,然后删除“Sam”密钥?
编辑:请注意,我不想覆盖整个 scores
映射,因为我不想不小心覆盖同时对该记录所做的其他更改。
Dynamo 在嵌套的键值对上调用此类项目 nested attributes. DynamoDB supports CRUD operations,但不单独调用键。
您可以使用 AWS CLI 或其中一种语言 SDK 定义 update expressions 针对单个地图或列表元素。 (提示:您可以在 Chrome DevTools 网络选项卡中查看 DynamoDB 控制台在后台执行的操作)。
因此,如果父键更新,则也需要设置子属性。如果您担心冲突,可以设置 Condition Expressions,如果不满足定义的条件(例如,如果在此期间未修改的属性已更改),将导致更新失败。
不,您不能更改映射条目的 key - 但您可以使用 UpdateExpression
做类似的事情,将旧条目复制到新的嵌套键, 然后删除旧的。例如,SET scores.#newname = scores.#oldname REMOVE scores.#oldname
(在 ExpressionAttributeNames
中设置了 #oldname
和 #newname
)。
这个表达式会将scores.Sam的值复制到scores.Steve,然后删除scores.Sam。如果对 scores 的 other 成员有并发更新,这不是问题 - 但如果 scores.Steve 已经存在或同时创建,这将是一个问题。因此,为此您可以使用 ConditionExpression
- 只有当 scores.Steve 以前不存在时,您才可以要求执行该 Steve 设置操作。例如,表达式可以是 attribute_not_exists (score.#newname)
- 因此操作只会写入 score.newname 如果它不存在。
如何以编程方式更改仅 DynamoDB 中嵌套映射的键而不同时更改该映射的值?
例如,请参阅下面我创建的 game
table。我想将名称“Sam”更改为“Steve”,而不必向地图添加新的 key/value 对。在 GUI 中,我可以更改名称并单击保存,但我找不到如何以编程方式执行此操作的示例。
是否可以只更改密钥?或者我是否需要创建一个新密钥“Steve”,将“Sam”的内容复制到“Steve”,然后删除“Sam”密钥?
编辑:请注意,我不想覆盖整个 scores
映射,因为我不想不小心覆盖同时对该记录所做的其他更改。
Dynamo 在嵌套的键值对上调用此类项目 nested attributes. DynamoDB supports CRUD operations,但不单独调用键。
您可以使用 AWS CLI 或其中一种语言 SDK 定义 update expressions 针对单个地图或列表元素。 (提示:您可以在 Chrome DevTools 网络选项卡中查看 DynamoDB 控制台在后台执行的操作)。
因此,如果父键更新,则也需要设置子属性。如果您担心冲突,可以设置 Condition Expressions,如果不满足定义的条件(例如,如果在此期间未修改的属性已更改),将导致更新失败。
不,您不能更改映射条目的 key - 但您可以使用 UpdateExpression
做类似的事情,将旧条目复制到新的嵌套键, 然后删除旧的。例如,SET scores.#newname = scores.#oldname REMOVE scores.#oldname
(在 ExpressionAttributeNames
中设置了 #oldname
和 #newname
)。
这个表达式会将scores.Sam的值复制到scores.Steve,然后删除scores.Sam。如果对 scores 的 other 成员有并发更新,这不是问题 - 但如果 scores.Steve 已经存在或同时创建,这将是一个问题。因此,为此您可以使用 ConditionExpression
- 只有当 scores.Steve 以前不存在时,您才可以要求执行该 Steve 设置操作。例如,表达式可以是 attribute_not_exists (score.#newname)
- 因此操作只会写入 score.newname 如果它不存在。