更新的答案 - 基于更新的问题陈述
您可以使用以下命令更新嵌套映射中的属性更新表达式 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html这样,只有项目的一部分会得到更新(即 DynamoDB 会将补丁应用于您的项目),但是,由于 DynamoDB 是一个文档数据库,因此所有操作(Put、Get、Update、Delete 等)都可以进行该项目作为一个整体。
所以,在你的例子中,假设User
是分区键并且没有排序键(在该示例中我没有看到任何可能是排序键的属性),更新请求可能如下所示:
table.update_item(
Key={
'User': 'test'
},
UpdateExpression="SET #inv[0].#loc = :locVal",
ExpressionAttributeNames={
'#inv': 'inventory',
'#loc': 'location'
},
ExpressionAttributeValues={
':locVal': 'in place three',
},
)
也就是说,您必须知道项目架构是什么样的,以及项目中的哪些属性应该准确更新。
DynamoDB 无法对子项进行操作。这意味着,无法告诉 Dynamo 执行诸如“更新项目,设置‘库存’数组元素的‘位置’属性,其中‘名称’属性等于‘欧宝’”
这可能不是您所希望的答案,但它是今天可用的答案。通过稍微更改架构,您也许可以更接近您想要的。
如果您需要按名称引用子项,可能存储如下内容:
{
"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',
},
)
但 YMMV 即使这样也有局限性,因为您只能通过名称来识别库存物品(即您仍然不能说“用标签'x1'更新库存”)
最终,您应该仔细考虑为什么需要 Dynamo 为您执行这些复杂的操作,而不是具体说明要更新的内容。