Json Lambda函数空白DynamoDB值
在1分钟的周期内,我得到2个事件(mqtt消息),它们进入Lambda函数(.js) 第一项活动: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
{
"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不同。由于错误状态,您需要向调用传递键
参数,以及其他内容。请参阅更新
此处的文档: