amazon-dynamodb - 如何动态更新 dynamodb 项目中的属性?

标签 amazon-dynamodb crud

我使用 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 个月,我应该发送如下内容:
{
“有效期”:“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);
  });
};

最佳答案

与其他评论相反,这是很有可能的,使用 UpdateItem Action 。
Language agnostic API docs
JavaScript specific API docs
如果要动态创建查询,请尝试以下操作:

const generateUpdateQuery = (fields) => {
    let exp = {
        UpdateExpression: 'set',
        ExpressionAttributeNames: {},
        ExpressionAttributeValues: {}
    }
    Object.entries(fields).forEach(([key, item]) => {
        exp.UpdateExpression += ` #${key} = :${key},`;
        exp.ExpressionAttributeNames[`#${key}`] = key;
        exp.ExpressionAttributeValues[`:${key}`] = item
    })
    exp.UpdateExpression = exp.UpdateExpression.slice(0, -1);
    return exp
}

let data = {
    'field' : { 'subfield': 123 },
    'other': '456'
}

let expression = generateUpdateQuery(data)

let params = {
    // Key, Table, etc..
    ...expression
}

console.log(params)
输出:
{ 
    UpdateExpression: 'set #field = :field, #other = :other',
    ExpressionAttributeNames: {
        '#field': 'field',
        '#other': 'other'
    },
    ExpressionAttributeValues: {
        ':field': { 
            'subfield': 123
        },
        ':other': '456'
    } 
}

关于amazon-dynamodb - 如何动态更新 dynamodb 项目中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55825544/

相关文章:

amazon-web-services - 循环中的 AWS BatchGetItem 与 GetItem

postgresql - Amazon Dynamodb 在 grails 中找到所有内容

javascript - DELETE 在 Express/Postgres 中未按预期工作

php 和 mysql 增删改查问题

php - 在 CRUD 中将创建和更新作为一项操作

python - 如何向 Dynamodb map 添加新 key 而不覆盖现有 key ?

mysql - 多日期时间列索引的最佳数据库解决方案

java - 如何在 Java 中从 DynamoDB getItem 获取特定属性值

c# - C# 的简单 CRUD 生成器

javascript - 具有多选选项的 jQuery 过滤器