AWS Lambda Node Js
如果存在其他元素,我要增加值。
+-----------------------+
| id | iteration | data |
+-----------------------+
| 10 | 1 | foo1 |
| 11 | 1 | foo2 |
| 12 | 2 | foo3 |
+-----------------------+
我的代码:
var AWS = require('aws-sdk');
var documentClient = new AWS.DynamoDB.DocumentClient({'region': 'eu-west-1'});
exports.handler = function(event, context, callback) {
var params = {
Item: {
id: uuid,
iteration: 1,
data: body.data
},
TableName: "my-table"
};
documentClient.put(params, function(err, data) {
if (err) {
console.log("Error", err);
const errResponse = {
statusCode: 500,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
};
callback(null, errResponse);
} else {
console.log("Success", params.Items);
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify("thanks")
};
callback(null, response);
}
});
}
我的插入没问题。
我尝试:
var params = {
TableName: "my-table",
Key:{
"id": uuid
},
UpdateExpression: "set iteration = iteration + :val",
ExpressionAttributeValues:{
":val": 1
},
ReturnValues:"UPDATED_NEW"
};
documentClient.update(params, function(err, data) {
if (err) {
console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
const errResponse = {
statusCode: 500,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
};
callback(null, errResponse);
} else {
console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify("thanks")
};
callback(null, response);
}
});
更新是可以的(递增-> 2)
但是我想我想要增量值ONLY,如果还存在ONLY添加元素。两种方法都是异步的,应该怎么办?
回答如下:您的第二个答案很接近。在UpdateExpression
中,您需要同时将ADD
和SET
放在同一行上。类似于以下内容:
UpdateExpression: "ADD iteration :iteration SET itemdata = :itemdata",
这已正式记录在DynamoDB下的AWS DOCS for UpdateItem中向下滚动说
ADD-如果属性没有指定的值,则将指定的值添加到项目已经存在。如果该属性确实存在,那么ADD的行为取决于属性的数据类型:如果现有属性是数字,并且“值”也是数字,然后将Value从数学上添加到现有属性。如果值是负数,然后从现有的数中减去属性。
我能够找到一个成功完成upsert的AWS forum post,以及在同一行中具有ADD和SET语法的另一个SO answer。下面是一些如果放置在新的lambda中将运行的代码(更改区域以匹配表的位置)
var AWS = require('aws-sdk');
var documentClient = new AWS.DynamoDB.DocumentClient({'region': 'eu-central-1'});
exports.handler = function(item, context, callback) {
var params = {
TableName: "my-table",
Key:{
"id": item.id
},
UpdateExpression: "ADD iteration :iteration SET itemdata = :itemdata",
ExpressionAttributeValues:{
':iteration': 1,
':itemdata' : item.data
},
ReturnValues:"NONE"
};
documentClient.update(params, function(err, data) {
if (err) {
console.log("Error", err);
const errResponse = {
statusCode: 500,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
};
callback(null, errResponse);
} else {
console.log("Success", params.Items);
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify("upsert complete.")
};
callback(null, response);
}
});
};
note:数据是保留关键字,出现以下错误:
Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: data
考虑将其更改为其他内容。我使用了itemdata
。
运行一次将插入一条新记录。以下图像是我第二次运行lambda之后表格的图像之前和之后的图像。
AWS Lambda Node Js
如果存在其他元素,我要增加值。
+-----------------------+
| id | iteration | data |
+-----------------------+
| 10 | 1 | foo1 |
| 11 | 1 | foo2 |
| 12 | 2 | foo3 |
+-----------------------+
我的代码:
var AWS = require('aws-sdk');
var documentClient = new AWS.DynamoDB.DocumentClient({'region': 'eu-west-1'});
exports.handler = function(event, context, callback) {
var params = {
Item: {
id: uuid,
iteration: 1,
data: body.data
},
TableName: "my-table"
};
documentClient.put(params, function(err, data) {
if (err) {
console.log("Error", err);
const errResponse = {
statusCode: 500,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
};
callback(null, errResponse);
} else {
console.log("Success", params.Items);
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify("thanks")
};
callback(null, response);
}
});
}
我的插入没问题。
我尝试:
var params = {
TableName: "my-table",
Key:{
"id": uuid
},
UpdateExpression: "set iteration = iteration + :val",
ExpressionAttributeValues:{
":val": 1
},
ReturnValues:"UPDATED_NEW"
};
documentClient.update(params, function(err, data) {
if (err) {
console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
const errResponse = {
statusCode: 500,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
};
callback(null, errResponse);
} else {
console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify("thanks")
};
callback(null, response);
}
});
更新是可以的(递增-> 2)
但是我想我想要增量值ONLY,如果还存在ONLY添加元素。两种方法都是异步的,应该怎么办?
回答如下:您的第二个答案很接近。在UpdateExpression
中,您需要同时将ADD
和SET
放在同一行上。类似于以下内容:
UpdateExpression: "ADD iteration :iteration SET itemdata = :itemdata",
这已正式记录在DynamoDB下的AWS DOCS for UpdateItem中向下滚动说
ADD-如果属性没有指定的值,则将指定的值添加到项目已经存在。如果该属性确实存在,那么ADD的行为取决于属性的数据类型:如果现有属性是数字,并且“值”也是数字,然后将Value从数学上添加到现有属性。如果值是负数,然后从现有的数中减去属性。
我能够找到一个成功完成upsert的AWS forum post,以及在同一行中具有ADD和SET语法的另一个SO answer。下面是一些如果放置在新的lambda中将运行的代码(更改区域以匹配表的位置)
var AWS = require('aws-sdk');
var documentClient = new AWS.DynamoDB.DocumentClient({'region': 'eu-central-1'});
exports.handler = function(item, context, callback) {
var params = {
TableName: "my-table",
Key:{
"id": item.id
},
UpdateExpression: "ADD iteration :iteration SET itemdata = :itemdata",
ExpressionAttributeValues:{
':iteration': 1,
':itemdata' : item.data
},
ReturnValues:"NONE"
};
documentClient.update(params, function(err, data) {
if (err) {
console.log("Error", err);
const errResponse = {
statusCode: 500,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
};
callback(null, errResponse);
} else {
console.log("Success", params.Items);
const response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin": "*"
},
body: JSON.stringify("upsert complete.")
};
callback(null, response);
}
});
};
note:数据是保留关键字,出现以下错误:
Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: data
考虑将其更改为其他内容。我使用了itemdata
。
运行一次将插入一条新记录。以下图像是我第二次运行lambda之后表格的图像之前和之后的图像。