是否可以在update_item中组合if_not_exists和list_append

fab*_*ian 57 amazon-dynamodb boto3

我正在尝试update_item在boto3中使用DynamoDB 的功能.

我现在正在努力更新物品清单.如果列表尚不存在,我想创建一个新列表,否则将附加到现有列表.

如果列表尚不存在,则使用UpdateExpression表单的a SET my_list = list_append(my_list, :my_value)返回错误"提供的表达式引用项目中不存在的属性".

知道我怎么修改我的UpdateExpression

谢谢和最好的问候,Fabian

Bor*_*rov 111

你可以使用list_append(if_not_exists())建筑.

UpdateExpression:

'SET my_list2 = list_append(if_not_exists(my_list2, :empty_list), :my_value)'
Run Code Online (Sandbox Code Playgroud)

ExpressionAttributeValues:

{ ":my_value":[{"S":"test"}], ":empty_list":[] }
Run Code Online (Sandbox Code Playgroud)

  • 我必须将我的`ExpressionAttributeValues`设置为`{":my_value":{"L":[{"S":"test"}]},":empty_list":{"L":[]}}`任何与我遇到同样问题的人. (4认同)
  • 我在文档中找不到直接确认,但我希望单个 UpdateItem 操作是原子的,这是我在常见问题解答中找到的最接近的东西 - “您可以使用单个 API 调用来增加或减少行中的数字属性。类似地,您可以自动添加或删除集合、列表或地图”,请参阅 https://aws.amazon.com/dynamodb/faqs/ (2认同)
  • @aidinism我认为你误解了这个问题和答案.它不是要防止重复值,问题是"如果列表尚不存在则如何创建新列表,否则将附加到现有列表.". (2认同)
  • 非常感谢您的建议!如果有人感兴趣,我在这里为我的项目工作:https://github.com/networth-app/networth/blob/f79f2c8d55b2614a09465331cf9b360c31d0bb1f/api/lib/dynamodb.go#L155 (2认同)

Ayu*_*ria 6

Boris 解决方案的替代方案可能是使用set而不是 list 数据类型并使用 ADD 关键字,它完全符合您的要求。

使用 Add,更新表达式变为: ADD setName :s

表达式属性值可以是这样的: {":s": {"SS":["First", "Second"]}}

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html#Expressions.UpdateExpressions.ADD

  • 请注意,“集合中值的顺序不保留”,因此如果您想要一个“有序集合”,那么您需要一个列表。您的表达式示例具有误导性,因为 `["First", "Second"]` 很容易返回为 `["Second", "First"]`。set 的好处是它不包含重复项。https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes (2认同)