在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 -
答案 0 :(得分:1)
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);
}
});
对于此示例,当您登录expression
和expressionAttribute
表达式是:SET Value1 =:Value1,Value2 =:Value2
expressionAttribute是:{':Value1':'qwe',':Value2':'qweqwe'}