Lambda函数使DynamoDB值空白

时间:2018-10-05 16:51:18

标签: json amazon-web-services aws-lambda amazon-dynamodb

在1分钟的周期内,我收到2个事件(mqtt消息),这些事件进入Lambda函数(.js)。

事件1:

{
  "ID": 789,
  "Value1": 1,
  "Value2: 2,
}

事件2:

{
  "ID": 789,
  "Value3: 3
}

问题:目前,我的代码首先将事件1放入数据库的一行中。事件2到达时,它会覆盖Value1和Value2并将其空白,因此,一分钟后,我最终在数据库中只得到了Value3。

问题::如何编辑代码,使其仅填写DynamoDB行中的空值? 我已经尝试过ConditionExpression,但没有成功。

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配置:

Table name  TABLE
Primary partition key   TimeStamp (String)
Primary sort key    -

2 个答案:

答案 0 :(得分:1)

来自the documentation

  

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

     

创建一个新项目,或者   用新项目替换旧项目。


  

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

     

编辑现有   项目的属性,如果没有,则将新项目添加到表中   已经存在。

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

答案 1 :(得分:0)

您可以更新获取的内容Event Object。 因此,您必须为此动态查询

用于按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);
    }
  });

对于此示例,当您登录expressionexpressionAttribute

  

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

     

expressionAttribute是:{':Value1':'qwe',':Value2':'qweqwe'}