Json Lambda函数空白DynamoDB值

Json Lambda函数空白DynamoDB值,json,amazon-web-services,aws-lambda,amazon-dynamodb,Json,Amazon Web Services,Aws Lambda,Amazon Dynamodb,在1分钟的周期内,我得到2个事件(mqtt消息),它们进入Lambda函数(.js) 第一项活动: { "ID": 789, "Value1": 1, "Value2: 2, } 第二项活动: { "ID": 789, "Value3: 3 } 问题:此时,我的代码首先将事件1放入数据库中的一行。当2号事件到达时,它覆盖并清空值1和值2,因此一分钟后,我在DB中只得到值3 问题:如何编辑代码,使其只填写DynamoDB行中的空值? 我曾尝试过条件表达,但没有成功 cons

在1分钟的周期内,我得到2个事件(mqtt消息),它们进入Lambda函数(.js)

第一项活动:

{
  "ID": 789,
  "Value1": 1,
  "Value2: 2,
}
第二项活动:

{
  "ID": 789,
  "Value3: 3
}
问题:此时,我的代码首先将事件1放入数据库中的一行。当2号事件到达时,它覆盖并清空值1和值2,因此一分钟后,我在DB中只得到值3

问题:如何编辑代码,使其只填写DynamoDB行中的空值? 我曾尝试过条件表达,但没有成功

console.log('Loading function');
var AWS = require('aws-sdk');
var dynamo = new AWS.DynamoDB.DocumentClient();
var table = "TABLE";

exports.handler = function(event, context) {
    console.log('Received event:', JSON.stringify(event, null, 2));
   var params = {
    TableName:table,
    Item:{
        "ID": event.ID,
        "Value1": event.Value1,
        "Value2": event.Value2,
        "Value3": event.Value3,
        "TimeStamp": String(Math.round(Date.now() / 60000) * 60000)
        },    
    };

    console.log("Adding...");
    dynamo.put(params, function(err, data) {
        if (err) {
            console.error("Unable to add. Error JSON:", JSON.stringify(err, null, 2));
            context.fail();
        } else {
            console.log("Added:", JSON.stringify(data, null, 2));
            context.succeed();
        }
    });
}

更新

用“dynamo.update”而不是“dynamo.put”编辑代码。现在代码无法创建新行。Json日志提供缺少密钥的错误

console.log('Loading function');
var AWS = require('aws-sdk');
var dynamo = new AWS.DynamoDB.DocumentClient();
var table = "TABLE";

exports.handler = function(event, context) {
    console.log('Received event:', JSON.stringify(event, null, 2));
   var params = {
    TableName:table,
    Item:{
        "ID": event.ID,
        "Value1": event.Value1,
        "Value2": event.Value2,
        "Value3": event.Value3,
        "TimeStamp": String(Math.round(Date.now() / 60000) * 60000)
        },    
    };

    console.log("Adding...");
    dynamo.update(params, function(err, data) {
        if (err) {
            console.error("Unable to add. Error JSON:", JSON.stringify(err, null, 2));
            context.fail();
        } else {
            console.log("Added:", JSON.stringify(data, null, 2));
            context.succeed();
        }
    });
}
DynamoDB配置中的表格:

Table name  TABLE
Primary partition key   TimeStamp (String)
Primary sort key    -
发件人:

putItem(参数={},回调)⇒ AWS.请求

创建新项目,或 用新项目替换旧项目


updateItem(参数={},回调)⇒ AWS.请求

编辑现有文件 项的属性,或者在表中添加新项(如果没有) 已经存在


因此,您需要将代码更改为使用
updateItem
而不是
putItem

,您可以更新得到的
事件对象。
因此,您必须动态查询

按id更新的动态查询示例

let event = {
    ID : '123',
    Value1 : 'qwe',
    Value2 : 'qweqwe'
  };
  let id = event.ID;
  delete event.ID;
  let expression = 'SET ';
  let expressionAttribute = {};
  
  for (var key in event){
        console.log(key)
        expression += key + ' = :' + key + ', ';
        expressionAttribute[':'+key] = _.get(event,key);
  }
  
  expression = expression.substr(0, expression.length-2);

  let queryParams = {
    TableName: 'table',
    Key: {
      'ID': id
    },
    UpdateExpression: expression,
    ExpressionAttributeValues: expressionAttribute,
    ReturnValues: 'UPDATED_NEW'
  };

  documentClient.update(queryParams, function (err, data) {
    if (err) {
      console.log('failure:update data from Dynamo error', err);
    } else {
      console.log('success:update data from Dynamo data', data);
    }
  });
例如,当您记录
expression
expressionAttribute

表达式为:SET Value1=:Value1,Value2=:Value2

表达式属性为:{:Value1':'qwe',':Value2':'qweqwe'}


谢谢你的建议!但是当我尝试代码不能创建新行时(每分钟都应该创建一个新行,因为时间戳是DynamoDB表中的键)。。也许可以稍微调整一下?具体调整什么?文档中明确指出,
updateItem
将在不存在新行的情况下创建新行。如果这对你不起作用,那么也许你应该问一个新的问题,详细说明这一点。这是日志中的错误:error JSON:{“message”:“params中缺少必需的键”“key”,“code”:“MissingRequiredParameter”,编辑您的问题以包含带有
updateItem
的代码,还包括表的架构定义。编辑了文章,请参见上文!谢谢您。
update
的API与
put
的API不同。由于错误状态,您需要向调用传递
参数,以及其他内容。请参阅
更新
此处的文档: