【问题标题】:DynamoDB - How to create map and add attribute to it in one updateDynamoDB - 如何在一次更新中创建地图并向其添加属性
【发布时间】:2017-03-31 01:41:06
【问题描述】:

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

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

但是,执行上述操作会给我错误提示 Two document paths overlap with each other

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

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

更新

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

{
  Entities: { A: { B: {} } },
}

一定有更好的办法。

【问题讨论】:

    标签: javascript node.js amazon-web-services amazon-dynamodb


    【解决方案1】:

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

    UpdateExpression: SET #A.#B = :valueOfB
    ConditionExpression: attribute_exists(#A)
    

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

    UpdateExpression: SET #A = :valueOfMapWithBInIt
    ConditionExpression: attribute_not_exists(#A)
    

    【讨论】:

    • 嗨,我也有同样的问题。在此解决方案中,如果另一个线程在第一个线程执行第二次更新之前尝试更新此属性怎么办?由于它们是两个不同的更新,我们需要一些锁定吗?谢谢
    • 很遗憾,您不能在事务中使用这种方法,因为“事务请求不能在一个项目上包含多个操作”
    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    相关资源
    最近更新 更多