我有 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"
我知道我可以使用多个请求来解决这个问题,但这当然会带来很小的成本和性能提升,但最重要的是,我发现这个挑战很有趣。 :)
无法通过单个请求来完成此任务。标准技术是获取该项目,在客户端更新它,然后使用乐观并发控制再次写入它,以确保在您使用该项目时没有其他人修改该项目。