【问题标题】:Lambda function blanks DynamoDB valuesLambda 函数将 DynamoDB 值留空
【发布时间】:2023-04-10 23:07:01
【问题描述】:

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

事件一:

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

事件二:

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

问题:目前我的代码首先将事件 1 放入数据库中的一行。当事件 2 到达时,它会覆盖并清除 Value1 和 Value2,所以一分钟后我在 DB 中只有 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    -

【问题讨论】:

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


【解决方案1】:

来自the documentation

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

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


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

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

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

【讨论】:

  • 感谢您的建议!但是当我尝试代码无法创建新行时(每分钟应该创建一个新行,因为时间戳是 DynamoDB 表中的键).. 也许可以稍微调整一下?
  • 究竟调整什么?文档清楚地指出updateItem 将创建一个新行,如果不存在的话。如果这对您不起作用,那么也许您应该提出一个新问题,详细说明。
  • 这是来自日志的错误:错误 JSON: { "message": "Missing required key 'Key' in params", "code": "MissingRequiredParameter",
  • 编辑您的问题以包含updateItem 的代码,并包含您的表的架构定义。
  • 已编辑帖子,见上文!谢谢。
【解决方案2】:

你可以更新你得到的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

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

【讨论】:

    猜你喜欢
    • 2018-08-29
    • 2021-12-28
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多