ネストされたマップを含む属性を持つdynamodbテーブルがあり、このマップから単一のアイテムを生成するフィルター式でフィルター処理された特定のインベントリアイテムを更新したい。
Name = opelでアイテムの「in place three」に位置を更新する更新式を記述する方法、タグには「x1」(および場合によってはf3)も含まれますか?これは、最初のリスト要素の場所属性を更新するだけです。
(
"inventory": [
{
"location": "in place one", # I want to update this
"name": "opel",
"tags": [
"x1",
"f3"
]
},
{
"location": "in place two",
"name": "abc",
"tags": [
"a3",
"f5"
]
}],
"User" :"test"
}
更新された回答-更新された質問文に基づいて
更新式 を使用してネストされたマップの属性を更新して、アイテムの一部のみが更新されるようにすることができます(つまり、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には、サブアイテムを操作する方法がありません。つまり、 "アイテムを更新し、 'name'のプロパティが 'inventory'配列の要素の 'location'プロパティを設定するなどの操作を実行するよう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が必要な理由を慎重に検討する必要があります。