DynamoDB - 如何在一次更新中创建地图并向其添加属性

piz*_*r0b 9 javascript amazon-web-services node.js amazon-dynamodb

我想创建一个新地图(如果它不存在),然后向该地图添加属性。像这样的东西:

SET #A = if_not_exists(#A, :emptyMap), #A.#B = :somevalue

然而,执行上述操作给我带来了错误:Two document paths overlap with each other

我唯一想做的另一件事是进行两次更新,一个用于创建任何空地图,然后另一个用于设置属性。

有没有办法在一次更新中做到这一点?

更新

另一个用例是创建包含其他地图的地图。目前我能想到的创建以下内容的唯一方法是 3 个单独的更新调用来创建地图(如果需要),然后另一个更新调用来添加属性:

{
  Entities: { A: { B: {} } },
}
Run Code Online (Sandbox Code Playgroud)

一定会有更好的办法。

Ale*_*kis 5

您可以分摊执行两个单独的 UpdateItem 调用的成本,一个调用创建 #A,另一个调用通过条件更新将 #B 添加到 #A,将 #B 添加到 #A。

UpdateExpression: SET #A.#B = :valueOfB
ConditionExpression: attribute_exists(#A)
Run Code Online (Sandbox Code Playgroud)

如果向 #A 添加许多条目,则只需创建 #A 一次,并且随着 #A 中条目数量的增加,创建 #A 的摊销时间接近于零。如果您捕获 ConditionalCheckFailedException,那么您将创建其中已包含 #B 的地图并调用 UpdateItem:

UpdateExpression: SET #A = :valueOfMapWithBInIt
ConditionExpression: attribute_not_exists(#A)
Run Code Online (Sandbox Code Playgroud)