更新的回答 - 基于更新后的问题陈述
您可以使用更新表达式在嵌套映射中更新属性,以便仅更新项目的一部分(即DynamoDB将对项目应用等效的补丁),但由于DynamoDB是文档数据库,所有操作(Put、Get、Update、Delete等)都作用于整个项目。
因此,在您的示例中,假设User
是分区键并且没有排序键(我没有看到任何可能成为排序键的属性),则Update请求可能如下所示:
table.update_item(
Key={
'User': 'test'
},
UpdateExpression="SET #inv[0].#loc = :locVal",
ExpressionAttributeNames={
'#inv': 'inventory',
'#loc': 'location'
},
ExpressionAttributeValues={
':locVal': 'in place three',
},
)
话虽如此,您确实需要知道项目模式的外观以及应更新哪些项目属性。
DynamoDB没有一种操作子项的方法。也就是说,无法告诉Dynamo执行类似于 "update item, set 'location' property of elements of the 'inventory' array that have a property of 'name' equal to 'opel'" 的操作。
这可能不是您希望得到的答案,但这是今天可用的方法。您可以通过稍微更改模式来更接近您想要的结果。
如果您需要按名称引用子项,可以存储类似于以下内容:
{
"inventory": {
"opel": {
"location": "in place one", # I want to update this
"tags": [ "x1", "f3" ]
},
"abc": {
"location": "in place two",
"tags": [ "a3", "f5" ]
}
},
"User" :"test"
}
那么你的查询将会是:
table.update_item(
Key={
'User': 'test'
},
UpdateExpression="SET #inv.#brand.#loc = :locVal",
ExpressionAttributeNames={
'#inv': 'inventory',
'#loc': 'location',
'#brand': 'opel'
},
ExpressionAttributeValues={
':locVal': 'in place three',
},
)
但因人而异,即使如此也有限制,因为您只能通过名称识别库存项目(即仍然无法说“使用标签'x1'更新库存”)。
最终,您应该仔细考虑为什么需要Dynamo来执行这些复杂操作,而不是明确指定要更新的内容。