如何更新dynamodb项目中的单个属性?

问题描述 投票:0回答:1

我使用Node js在dynamodb中创建了一个项目,该项目有多个属性,如品牌,类别,折扣,有效性等。我使用uuid为每个项目生成ID。现在假设我要更新项目的有效性属性,在这种情况下,我当前正在发送整个json对象,并将有效值修改为新值。

这绝对不是最佳的,请帮我找到最佳解决方案。

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个月,我应该发送类似的内容:{“validity”:“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);
  });
};
amazon-dynamodb crud
1个回答
0
投票

您可以使用代码并根据您提供的对象生成params对象。它只是一个JavaScript对象,您遍历这些项目,以便更新表达式仅包含您提供的字段。这不是一个真正的DynamoDB问题,因为这更像是一个通用的JS编码问题。

© www.soinside.com 2019 - 2024. All rights reserved.