Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 更新dynamodb记录中的属性_Node.js_Amazon Web Services_Amazon Dynamodb_Dynamodb Queries_Amazon Dynamodb Local - Fatal编程技术网

Node.js 更新dynamodb记录中的属性

Node.js 更新dynamodb记录中的属性,node.js,amazon-web-services,amazon-dynamodb,dynamodb-queries,amazon-dynamodb-local,Node.js,Amazon Web Services,Amazon Dynamodb,Dynamodb Queries,Amazon Dynamodb Local,我正在尝试更新dynamodb表中的现有记录。 如下图所示,我的表中有一个项目 let params = { TableName: proces.env.dynamoDbTable, Item: { productId: "id", att1: val1, att2: val2 } } 我想执行更新。我正在使用aws dynamodb sdk的更新方法,并将其传递给如下参数 let aws = require('

我正在尝试更新dynamodb表中的现有记录。 如下图所示,我的表中有一个项目

let params = {
   TableName: proces.env.dynamoDbTable,
   Item: {
      productId: "id",
      att1: val1,
      att2: val2
      }
 }
我想执行更新。我正在使用aws dynamodb sdk的更新方法,并将其传递给如下参数

let aws = require('aws-sdk');
 let dbb = new aws.DynamoDb.DocumentClient();
 let params = {
  TableName: process.env.tableName,
  Key: {productID}
  ExpressionAttributeNames: { "#updatedAt" : "updatedAt" }
  ExpressionAttributeValues: {":u":moment().unix(), ":val1" : a, ":val2": b}
  UpdateExpression: "SET att1 = :val1, att2: val2, #updatedAt: :u"
 }
// a, b are passed as argument to function and are optional
dbb.update(params).promise()

当一个参数丢失时,dynamo会引发ExpressionAttributeValue丢失异常,我知道它是直接的。是否有一种方法可以使用提供的属性更新我的项目

不幸的是,dynamodb并没有让这变得容易。但您可以使用一些奇特的js动态创建params对象:

//对于某些对象'attrs',我们找到需要更新的键
常量键=对象键(属性);
常量值=对象值(属性);
//获取与dynamodb语法匹配的键名和值名列表
常量attributeKeyNames=keys.map((k)=>key+k);
常量attributeValueNames=keys.map((k)=>':val_'+k);
//为每个需要更新的属性创建单独的表达式
常量表达式=attributeValueNames.map((attr,i)=>{
返回`${attributeKeyNames[i]}=${attr}`;
});
//将SET关键字添加到字符串的开头
//并用逗号连接所有表达式
const UpdateExpression='SET'+expressions.join(',');
//我使用lodash中的'zipObject()https://lodash.com/docs/4.17.15#zipObject
//它从两个数组中生成对象映射,其中第一个数组是键和
//第二是价值观
const ExpressionAttributeValues=u0.zipObject(attributeValueNames,values);
const ExpressionAttributeNames=uu.zipObject(attributeKeyNames,key);
//现在你有了所有的情人
常量参数={
表名,
关键:{
uuid,
},
UpdateExpression,
表达式属性值,
ExpressionAttributeNames,
};
效果很好。但要记住以下几点:

如果要将具有唯一键的对象发送到更新函数中,则必须在映射表达式数组之前删除该键,否则该键将包含在查询中,并将出现错误:

const newObject = {...originalObject}
delete newObject.unique_key
如果不能或不想使用Lodash,可以使用Object.assign映射键/值数组:

const ExpressionAttributeValues = Object.assign(...attributeValueNames.map((k, i) => ({[k]: values[i]})));
const ExpressionAttributeNames = Object.assign(...attributeKeyNames.map((k, i) => ({[k]: keys[i]})));

“当一个参数丢失时”是什么意思?另外,
表达式属性名称必须以磅符号(#)开头,
@LucasD这里是我的更新表达式的样子“SET#name=:n,#slug=:s,#updatedAt=:u,description=:d,thumbnail=:t”我从前端收到一个请求,更新一个名为“description”的参数。当我调用update方法时,它抛出一个代码“ValidationException”,缺少属性值:n。我知道,由于我没有传递值,因此预期会出现错误。我如何才能只更新收到的几个属性,而保留其余的属性?请用正确的格式更新您的问题。希望其他人能用更优雅的solution@LucasD当然,我会重新编排问题的格式。谢谢你的回答。我将在此处尝试并更新。:)