Обновить элемент в Dynamodb?

Я новичок в этой технологии. Так что терпите мое объяснение ниже.

Мой вариант использования:

Я обновляю элемент в Dynamodb на основе первичного ключа (ID). В основном моя запись состоит из 4 столбцов (ID, описание, имя, цена).

Проблема здесь в том, что, предположим, у меня есть элемент с ключом 123.

ID description name price

123 Model      nokia  10

когда я использую вышеуказанную функцию lamda для обновления всех столбцов, она работает нормально. Но когда я пытаюсь обновить только столбец description, возникает ошибка «ExpressionAttributeValues ​​не может быть пустым». Поэтому для этого я сделал что-то вроде этого

ExpressionAttributeValues:{
     ":d":event.description ? event.description : null ,
     ":n":event.name ? event.name : null,
     ":p":event.price ? event.price : null
     }

Но проблема в том, что он обновит единственное значение, которое я указал. Например, если бы я дал только descriptionmodal1, тогда он изменит это и даст такой результат

ID description name price

123 Model1  null  null

Это правильно, потому что этот фрагмент выше говорит об этом.

Чего я хочу достичь?

Как я могу изменить это поведение, чтобы оно стало таким?

ID description name price

123 Model1     nokia  10
  1. Есть ли способ, которым это будет обновить только переданные параметры и сохранить предыдущие параметры для остальных значения ?

Любая помощь приветствуется

Обновленный код

var AWS = require("aws-sdk");
AWS.config.update({
    region: "regionname",
    endpoint: "endpointurl"
});
var docClient = new AWS.DynamoDB.DocumentClient()

var tablename = "Example"; 


var UpdateExpression = "'set";
var ExpressionAttributeValues= {};
var ExpressionAttributeNames= {};
var ID = "xx";
var description = "Iphone";
var name = "xx";
var price = 50;
 var params = { 
    TableName: tablename, 
    Key:{ 
    "ID": ID 
    }
    };
docClient.update(params,onUpdate);
 function onUpdate(err) {
    if (err) {
        console.error("Unable to scan the table. Error JSON:", JSON.stringify(err, null, 2));
    } else {
        console.info("Update succeeded.");
    }
    if (description) { 
        UpdateExpression = UpdateExpression + " description = :d,",
        ExpressionAttributeValues [":d"] =  description ,
        console.info("first...")

        }
        if (name){ 
        UpdateExpression = UpdateExpression + " #na = :n,",
        ExpressionAttributeNames['#na'] = 'name' ,
        ExpressionAttributeValues[":n"] = name ,
        console.info("second...")
        }
        if (price){ 
        UpdateExpression = UpdateExpression + " price = :p',",
        ExpressionAttributeValues[":p"] = price ,
        console.info("third...")
        }        
        console.info(UpdateExpression)
        console.info(ExpressionAttributeNames)
        console.info(ExpressionAttributeValues)
        return (UpdateExpression,ExpressionAttributeNames,ExpressionAttributeValues)
    }

Когда я запустил код, я получил следующий результат:

D: \ Dynamo> узел FullUpdate.js

Update succeeded.
first...
second...
third...
'set description = :d, #na = :n, price = :p',
{ '#na': 'name' }
{ ':d': 'Iphone', ':n': 'xx', ':p': 50 }
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
0
1 452
1

Ответы 1

Вы должны составить свой запрос в зависимости от переменных, которые у вас есть, поэтому вам нужно сделать что-то вроде этого

UpdateExpression = "set";
ExpressionAttributeValues: {};
ExpressionAttributeNames: {};

if (event.description){
 UpdateExpression = UpdateExpression + "description = :d";
 ExpressionAttributeValues[":d"] = event.description
}
if (event.name){
 UpdateExpression = UpdateExpression + "#na = :n";
 ExpressionAttributeNames['#na'] = 'name'
 ExpressionAttributeValues[":d"] = event.name
}
if (event.price){
 UpdateExpression = UpdateExpression + "price = :p";
 ExpressionAttributeValues[":d"] = event.pice
}

будьте осторожны с запятыми и зарегистрируйте свой запрос, чтобы убедиться, что он соответствует вашим ожиданиям. вы можете проверить функцию, которую я использую для этой цели,

update(_id, store_id, opts?) {

    var Key = {
      _id: _id,
      store_id: store_id
    };

    if (Object.keys(opts).length > 0) {
      let UpdateExpression =
        "SET #date = :date, #author = :author";

      let ExpressionAttributeNames = {
        "#date": "date",
        "#author": "author"
      }

      let ExpressionAttributeValues = {
        ":date": new Date().getTime(),
        ":author": localStorage.getItem('user_id')
      }

      if ((opts && opts.title)) {
        UpdateExpression = UpdateExpression + "#title = :title,";
        ExpressionAttributeNames["#title"] = "title";
        ExpressionAttributeValues[":title"] = opts.title
      }

      if ((opts && opts.category)) {
        UpdateExpression = UpdateExpression + "#category = :category,";
        ExpressionAttributeNames["#category"] = "category";
        ExpressionAttributeValues[":category"] = opts.category
      }

      if ((opts && opts.category)) {
        UpdateExpression = UpdateExpression + "#dimension = :dimension,";
        ExpressionAttributeNames["#dimension"] = "dimension";
        ExpressionAttributeValues[":dimension"] = opts.dimension
      }

      if ((opts && opts.category)) {
        UpdateExpression = UpdateExpression + "#destination = :destination,";
        ExpressionAttributeNames["#destination"] = "destination";
        ExpressionAttributeValues[":destination"] = opts.destination
      }

      if ((opts && opts.category)) {
        UpdateExpression = UpdateExpression + "#timeStart = :timeStart,";
        ExpressionAttributeNames["#timeStart"] = "timeStart";
        ExpressionAttributeValues[":timeStart"] = opts.timeStart
      }

      if ((opts && opts.category)) {
        UpdateExpression = UpdateExpression + "#timeEnd = :timeEnd,";
        ExpressionAttributeNames["#timeEnd"] = "timeEnd";
        ExpressionAttributeValues[":timeEnd"] = opts.timeEnd
      }

      if ((opts && opts.publish)) {
        UpdateExpression = UpdateExpression + "#publish = :publish,"
        ExpressionAttributeNames["#publish"] = "publish"
        ExpressionAttributeValues[":publish"] = "x";
      }


      UpdateExpression = UpdateExpression.replace(new RegExp(',$'), '');

      if ((opts && opts.nbviews)) {
        UpdateExpression = UpdateExpression + "ADD #nbviews = :nbviews"
        ExpressionAttributeNames["#nbviews"] = "nbviews"
        ExpressionAttributeValues[":nbviews"] = 1;
      }

      if ((opts && !opts.publish)) {
        UpdateExpression = UpdateExpression + " REMOVE #publish"
        ExpressionAttributeNames["#publish"] = "publish"
      }

      return this.dataService.update(TABLENAME, Key, UpdateExpression, null, ExpressionAttributeNames, ExpressionAttributeValues);

Спасибо @Temkit. Но я не могу использовать этот подход в лямбде, потому что он не принимает . в if (event.description).

Private 01.08.2018 13:59

я не понимаю, что вы имеете в виду, говоря "не принимаю. в if (event.description)"?

sidali 01.08.2018 14:04

Он показывает parsing error : unexpected token в лямбда-консоли.

Private 01.08.2018 14:23

Можно показать код, который вы используете, на самом деле я реализовал указанную выше функцию в лямбда

sidali 01.08.2018 14:25

Ох, хорошо. Может быть, я что-то упускаю. Код находится в разделе UPDATE моего вопроса.

Private 01.08.2018 14:30

вы не можете использовать оператор IF в объекте, проверьте свой код в ExpressionAttributeNames: {.... и закройте его перед IF!

sidali 01.08.2018 15:23

Другие вопросы по теме