DynamoDB условно поставлен - PullRequest
0 голосов
/ 07 ноября 2019

Скажите, что я хочу добавить запись, как показано ниже:

{
id:876876,
username:example,
email:xxxxxx@xxx.com,
phone:xxxxxxx,
created_at:current_date,
updated_at:current_date
}

Что я хочу, это проверить с идентификатором, если запись существует created_date не должен быть изменен только updated_date должен иметь current_date.

Можем ли мы сделать это методом put без необходимости вызова get item?

1 Ответ

0 голосов
/ 07 ноября 2019

Чтобы создать новый элемент или обновить существующий элемент с помощью условного выражения. Предпочитают использовать updateItem вместо putItem .

Если хеш-ключ (первичный ключ) не существует, то putItem и updateItem создают новую запись. Если запись уже существует, putItem полностью переопределит существующую строку, но updateItem обновит только атрибуты, переданные в UpdateExpression , а не целую запись.

В вашем случае используйте функцию if_not_exists(), чтобы проверить, существует ли поле created_at или нет. Если существует, created_at не будет переопределено.

Обновление выражения: "SET #email = :email, #created_at = if_not_exists(#created_at, :created_at), #updated_at = :updated_at"

Пример фрагмента

var params = {
    ExpressionAttributeNames: {
     "#email": "email", 
     "#created_at": "created_at",
     "#updated_at": "updated_at"
    }, 
    ExpressionAttributeValues: {
     ":email": {
       S: "test2@grr.la"
      }, 
     ":created_at": {
       S: date.toISOString()
      },
      ":updated_at": {
        S: date.toISOString()
    }
    }, 
    Key: {
     "id": {
       S: "T1"
      }
    }, 
    ReturnValues: "ALL_NEW", 
    TableName: "stack", 
    UpdateExpression: "SET #email = :email, #created_at = if_not_exists(#created_at, :created_at), #updated_at = :updated_at"
   };
   ddb.updateItem(params, function(err, data) {
     if (err) console.log(err, err.stack); // an error occurred
     else     console.log(data);  
   })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...