DynamoDB: Как обновить элемент, за исключением одного атрибута, если атрибут уже существует - PullRequest
0 голосов
/ 24 января 2020

Итак, я пытаюсь поместить Предмет в таблицу DDB (nodejs). Если у элемента есть атрибут «date_created», я хочу обновить все поля в этом элементе, кроме «date_created».

Я посмотрел на условные выражения и насколько я понимаю, он довольно двоичный. Если условие == истинно, продолжайте, если нет, то не делайте. То, что я ищу, это делать пут независимо от того, что, но не обновлять date_created, если он существует.

Возможно ли это? Я даже подхожу к этому с правильным мышлением?

Ответы [ 3 ]

0 голосов
/ 24 января 2020

Я согласен с @jarmod относительно лучшего способа сделать это; однако, если вы действительно хотите обновить все поля, кроме одного, вы можете сделать update вместо put. В JavaScript вы даже можете сгенерировать оператор обновления на основе ключей в данных и исключить значение date_created, если оно окажется в данных.

0 голосов
/ 02 февраля 2020

Вам не нужен PutItem с условным выражением для этого случая.

Вам необходимо использовать UpdateItem API. UpdateItem «расстроен», поэтому, если первичный ключ не существует, API приведет к вставке нового элемента. Этот API принимает Обновление выражения , которое можно использовать для установки, изменения и / или удаления одного или нескольких полей из элемента. У выражений обновления есть несколько специальных функций, доступных для них, и для предотвращения перезаписи существующих данных вы должны использовать if_not_exists(path, operand). Если path не существует, DynamoDB поместит результат operand в path. Если path существует, он не изменится.

Выражение обновления для вашего случая будет выглядеть примерно так:

SET if_not_exists(date_created, :right_now), other_field_1 = :value_1, other_field_2 = :value_2
0 голосов
/ 24 января 2020

Я не верю, что DynamoDB изначально поддерживает это.

Лучшее решение может иметь date_created при первоначальном размещении и date_updated при последующих обновлениях. Начальное размещение является следствием некоторой высокоуровневой операции типа «новый элемент» (например, «Добавить сотрудника»). Последующие обновления не должны быть условными - они не включают date_created, просто date_updated. И вы скрываете эти два атрибута в слое вашей модели (который, например, реализует createRecord() и updateRecord()).

В качестве альтернативы, сделайте начальную установку DDB, включая date_created, что обусловлено date_created отсутствует. Если этот условный запрос не выполнен, выполните обновление без date_created.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...