DynamoDB:是否可以在一个更新请求中添加和删除同一列表属性?

问题描述 投票:0回答:1

我有 DynamoDB 项目,我想在其中存储“循环”类型的列表,以便我可以添加新项目,但我永远不希望列表长于 N 个元素。

我想我可以使用以下方法来做到这一点:

SET items = list_append(["new_value"], items) 
DELETE items[3]

我认为这应该可行,因为根据文档,DELETE:ing 一个不存在的属性应该是无操作,所以如果在列表中首先添加新元素后列表有 0-2 个元素,我不会删除任何东西;否则我会删除第 4 个元素,始终将列表的最大大小保持为 3(假设没有其他更新添加元素而无需进行整理)。

但是,DynamoDB 失败并显示以下消息:

Invalid UpdateExpression: Two document paths overlap with each other; 
  must remove or rewrite one of these paths; 
path one: [items], path two: [items, [3]]

令人非常沮丧的是,使用

list_append
更新数组元素和修改数组本身被视为两个重叠操作。

有没有办法在一个请求中完成我想要的事情? 我得到的最接近的是手动移动列表中的每个元素,如果最大尺寸很小,它会起作用,但也感觉非常丑陋(此处显示 max=3):

SET items[2] = if_not_exists(items[1], null)
    items[1] = if_not_exists(items[0], null)
    items[0] = "new_value"

我知道我可以使用多个请求来解决这个问题,但这当然会带来很小的成本和性能提升,但最重要的是,我发现这个挑战很有趣。 :)

amazon-dynamodb
1个回答
0
投票

无法通过单个请求来完成此任务。标准技术是获取该项目,在客户端更新它,然后使用乐观并发控制再次写入它,以确保在您使用该项目时没有其他人修改该项目。

© www.soinside.com 2019 - 2024. All rights reserved.