我使用Node js在dynamodb中创建了一个项目,该项目具有多个属性,例如品牌,类别,折扣,有效性等。我正在使用uuid为每个项目生成ID。现在,假设我要更新商品的validity属性,在这种情况下,我目前正在发送将validity值修改为新值的整个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);
});
};
答案 0 :(得分:0)
您可以使用代码并根据您提供的对象生成params对象。它只是一个JavaScript对象,您将遍历所有项目,以便更新表达式仅包含您提供的字段。 这实际上不是DynamoDB问题,因为它更像是一个通用的JS编码问题。
答案 1 :(得分:0)
与其他评论相反,这很有可能,请使用 UpdateItem 操作。
如果要动态创建查询,请尝试以下操作:
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' } }
答案 2 :(得分:0)
你可以使用UpdateItem;要熟悉 DynamoDb 查询,我建议您使用 DynamoDb NoSQL 工作台: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/workbench.settingup.html
它可以根据您的查询为您生成片段。