К сожалению, синтаксис UpdateExpression
не такой мощный, как вам хотелось бы. Он поддерживает целые вложенные документы внутри элемента, но не сложные выражения для поиска в них или их изменения. Единственная возможность, которую он дает вам внутри списка, - это доступ или изменение его N-го элемента. Например:
REMOVE #favorites.#imagelibrary[3]
Удалит 3-й элемент библиотеки imagelibrary (обратите внимание, что «#imagelibrary
» нужно будет определить в ExpressionAttributeNames
), и вы также можете иметь условие для #favorites.#imagelibrary[3].#id
, например, в ConditionExpression
. Но, к сожалению, нет способа указать более сложные комбинации условий и обновлений, такие как «найди мне i, где # избранное. # Imagelibrary [i]. # Id равно что-то, а затем УДАЛИТЬ этот конкретный c элемент» .
Ваш оставшийся вариант - прочитать полное значение элемента (или с ProjectionExpression
только массив #favorties.#imagelibrary
), а затем в своем собственном коде найти, какой из элементов вы хотите удалить (например, , обнаружите, что это 3-й элемент), а затем в отдельном обновлении удалите 3-й элемент.
Обратите внимание, что если есть вероятность, что какая-то другая параллельная операция также изменит элемент, вы должны использовать условное обновление (как UpdateExpression
, так и ConditionExpression
) для удаления элемента, чтобы убедиться, что удаляемый элемент по-прежнему имеет ожидаемый идентификатор. Если условие не выполняется, вам нужно повторить всю операцию снова - прочитать измененный элемент еще раз, снова найти элемент и снова попытаться удалить его. Это пример так называемого метода блокировки optimisti c, который часто используется с DynamoDB.