Как обновить один атрибут в элементе DynamodB? - PullRequest
0 голосов
/ 24 апреля 2019

Я создал элемент в Dynamodb, используя Node js, у элемента есть несколько атрибутов, таких как марка, категория, скидка, срок действия и т. Д. Я использую uuid для генерации идентификаторов для каждого элемента. Теперь предположим, что я хочу обновить атрибут validity элемента, и в этом случае я сейчас отправляю весь объект json со значением validity, измененным на новое значение.

Это определенно не оптимально, пожалуйста, помогите мне найти оптимальное решение.

const params = {
    TableName: process.env.PRODUCT_TABLE,
    Key: {
      id: event.pathParameters.id,
    },
    ExpressionAttributeNames: {
      '#discount': 'discount',
    },
    ExpressionAttributeValues: {
      ':brand': data.brand,
      ':category': data.category,
      ':discount': data.discount,
      ':denominations': data.denominations,
      ":validity": data.validity,
      ":redemption": data.redemption    
    },
    UpdateExpression: 'SET #discount = :discount, denominations = :denominations, brand = :brand, category = :category, validity = :validity, redemption = :redemption',
    ReturnValues: 'ALL_NEW',
  };

Я хочу отправить только атрибут, который я хочу обновить с новым значением, если я хочу изменить срок действия с 6 до 8 месяцев, я должен просто отправить что-то вроде: { «срок действия»: «8 месяцев» } И это должно обновить атрибут действительности предмета. То же самое должно применяться к любому другому атрибуту предмета.

'use strict';

const AWS = require('aws-sdk');

const dynamoDb = new AWS.DynamoDB.DocumentClient();

module.exports.update = (event, context, callback) => {
  const data = JSON.parse(event.body);

  let attr = {};
  let nameobj = {};
  let exp = 'SET #';
  let arr = Object.keys(data);
  let attrname = {};

  arr.map((key) => {attr[`:${key}`]=data[key]});

  arr.map((key) => {
    exp += `${key} = :${key}, `
  });

  arr.map((key) => {nameobj[`#${key}`]=data[key]});

  attrname = {
    [Object.keys(nameobj)[0]] : nameobj[Object.keys(nameobj)[0]]
  }

  const params = {
    TableName: process.env.PRODUCT_TABLE,
    Key: {
      id: event.pathParameters.id,
    },
    ExpressionAttributeNames: attrname,
    ExpressionAttributeValues: attr,
    UpdateExpression: exp,
    ReturnValues: 'ALL_NEW',
  };

  // update the todo in the database
  dynamoDb.update(params, (error, result) => {
    // handle potential errors
    if (error) {
      console.error(error);
      callback(null, {
        statusCode: error.statusCode || 501,
        headers: { 'Content-Type': 'text/plain' },
        body: 'Couldn\'t update the card',
      });
      return;
    }

    // create a response
    const response = {
      statusCode: 200,
      body: JSON.stringify(result.Attributes),
    };
    callback(null, response);
  });
};

1 Ответ

0 голосов
/ 24 апреля 2019

Вы можете использовать код и генерировать объект params на основе предоставленного вами объекта.Это просто объект JavaScript, вы проходите через элементы, чтобы выражение обновления содержало только те поля, которые вы указали.На самом деле это не вопрос DynamoDB, поскольку это более общий вопрос кодирования JS.

...