如何使用API网关的主体映射模板在dynamodb中插入多行?
我的代码输入是“xyz 1,abc 2”,其中包含有关要插入的2行的信息。
只存储了第二条“abc 2”的记录,我希望将两条记录都插入到表中。以下是我写的代码
#set($rawAPIData = $input.path('$'))
#set ($bulk = $rawAPIData.split(","))
{
"TableName": "tablename",
#foreach( $records in $bulk)
#set ($s = $records.split(" "))
"Item": {
"col1": {
"S": "$s.get(0)"
},
"col2": {
"S": "$s.get(1)"
}
}
#if( $foreach.hasNext ), #end
#end
}
我是新手,建议真有帮助
答案 0 :(得分:2)
This AWS guide显示了如何使用API网关作为DynamoDB的代理。它与您尝试采用的方法类似。作为建议,最好让您的api一次只关注一行,而不是在,
上拆分多个输入。例如,它会稍微简化您的模板,以发送类似于指南中的请求。
示例请求正文:
{
"col1": "xyz",
"col2": "1"
}
模板(源自您的模板代码):
{
"TableName": "tablename",
"Item": {
"col1": {
"S": "$input.path('$.col1')"
},
"col2": {
"S": "$input.path('$.col2')"
}
}
}
但是,如果您想坚持使用多个项目,BatchWriteItem文档值得一读。在这个例子之后,我认为这应该是你的身体模板:
#set($rawAPIData = $input.path('$'))
#set ($bulk = $rawAPIData.split(","))
{
"RequestItems": {
"tablename": [
#foreach($records in $bulk)
#set ($s = $records.split(" "))
{
"PutRequest": {
"Item": {
"col1": {
"S": "$s.get(0)"
},
"col2": {
"S": "$s.get(1)"
}
}
}
}
#if( $foreach.hasNext ),
#end
]
}
#end
}
答案 1 :(得分:0)
我使用了与@Gerand类似的方法,但我使用lambda解决了它。这是工作代码:
'use strict';
const AWS = require("aws-sdk");
const dynamodb = new AWS.DynamoDB();
exports.handler = (event, context, callback) => {
var data=event.data;
var bulk = data.split(",");
var toSave = [];
for(var i = 0; i < bulk.length; i++) {
var s=bulk[i].split(" ");
var item = {
"col1": {
S: s[0]
},
"col2": {
S: s[1]
}
};
toSave.push(item);
}
var items = [];
for(var i = 0; i < toSave.length; i++) {
items[i] = {
PutRequest: { Item: toSave[i] }
}
}
var params = {
RequestItems: {
'table_name': items
}
};
dynamodb.batchWriteItem(params, function(err, data) {
console.log("Response from DynamoDB");
if(err) console.log(err);
else console.log(data);
});
};