Javascript 从DynamoDB响应中删除数据类型描述符的推荐方法是什么?
DynamoDB为查询响应中的每个元素都包含一个数据类型描述符,如下所示:Javascript 从DynamoDB响应中删除数据类型描述符的推荐方法是什么?,javascript,amazon-web-services,aws-lambda,amazon-dynamodb,Javascript,Amazon Web Services,Aws Lambda,Amazon Dynamodb,DynamoDB为查询响应中的每个元素都包含一个数据类型描述符,如下所示: "Item": { "M" : { "Age": {"N": "8"}, "Name": {"S": "Fido"}, "Vaccinations": { "M": { "Rabies": { "L": [ {"S": "
"Item": {
"M" : {
"Age": {"N": "8"},
"Name": {"S": "Fido"},
"Vaccinations": {
"M": {
"Rabies": {
"L": [
{"S": "2009-03-17"},
{"S": "2011-09-21"},
{"S": "2014-07-08"}
]
},
"Distemper": {"S": "2015-10-13"}
}
}
}
}
我想去掉所有这些描述符(“S”、“L”、“M”等),这样看起来就像下一个例子,在我JSON.stringify
数据之前
"Item": {
"Age": "8",
"Name": "Fido",
"Vaccinations": {
"Rabies": [
"2009-03-17",
"2011-09-21",
"2014-07-08"
]
"Distemper": "2015-10-13"
}
}
有没有标准的(或推荐的)方法可以做到这一点?可能是这样的:
var数据={“项”:{
“年龄”:{“N”:“8”},
“名称”:{“S”:“Fido”},
“疫苗接种”:{
“M”:{
“狂犬病”:{
“L”:[
{“S”:“2009-03-17”},
{“S”:“2011-09-21”},
{“S”:“2014-07-08”}
]
},
“犬瘟热”:{“S”:“2015-10-13”}
}
}}};
var keys_black_list=['N','S','M','L'];
功能正确\u数据(\u数据){
var new_data={};
用于(var输入_数据){
if(类型为_数据[键]=‘对象’){
用于(var bl_钥匙中的钥匙\u黑名单){
如果(_数据[键][键]黑名单[键]){
如果(数据[键][键]黑名单[键]]的类型=='object'){
新的_数据[键]=正确的_数据(_数据[键][键]黑名单[bl_键]);
}否则{
新_数据[键]=_数据[键][键黑名单[键];
}
}
}
}
}
返回新的_数据;
}
console.log(正确的_数据(data.Item))代码>不熟悉使用DynamoDb。我猜你可以使用SDK来完成这项工作,或者查询中的设置可以用来关闭描述符
以下内容似乎适用于您样本中的所有案例
var描述符=['L','M','N','S'];
函数展平(o){
//展平具有描述符的单个特性对象
for(让d个描述符组成){
如果(o.hasOwnProperty(d)){
返回o[d];
}
}
Object.keys(o.forEach)(k)=>{
for(让d个描述符组成){
if(o[k].hasOwnProperty(d)){
o[k]=o[k][d];
}
}
if(Array.isArray(o[k])){
o[k]=o[k].map(e=>flatten(e))
}else if(o[k]=“对象”的类型){
o[k]=展平(o[k])
}
});
返回o;
}
数据=展平(数据)
console.log(数据)
。作为控制台包装器{
最大高度:100%;
}
var数据={“项目”:{“年龄”:{“N”:“8”},“姓名”:{“S”:“Fido”},“疫苗接种”:{“M”:{“狂犬病”:{“L”:{“S”:“2009-03-17”}、{“S”:“2011-09-21”}、{“S”:“2014-07-08”}、{“犬瘟热”:{“S”:“2015-10-13”};
使用DynamoDB DocumentClient,它将为您完成此任务
参见使用DynamoDB DocumentClient,正如@bwinant所建议的那样,可以完全避免使用类型描述符
下面的示例在http请求处理程序中使用docClient get()和put()
// handleHttpRequest is the entry point for Lambda requests
exports.handleHttpRequest = function(request, context, done) {
try {
const id = request.pathParameters.id;
let response = {
headers: {},
body: '',
statusCode: 200
};
switch (request.httpMethod) {
case 'GET': {
let dynamo = new AWS.DynamoDB();
var params = {
TableName: myTable,
Key: { 'id' : id },
};
docClient.get(params, function(err, data) {
if (err) {
throw `Dynamo Get Error (${err})`
} else {
response.body = JSON.stringify(data.Item);
done(null, response);
}
});
break;
}
case 'POST': {
let myData = JSON.parse(request.body || '{}');
let params = {
TableName: myTable,
Item: {
id : id,
my_data : myData
}
}
docClient.put(params, function(err, data) {
if (err) {
throw `Dynamo Put Error (${err})`;
} else {
done(null, data);
}
});
}
}
} catch (e) {
done(e, null);
}
}
他们有一个转换器,你可以使用
例如,他们的例子如下:
var data= {"Item": {
"Age": {"N": "8"},
"Name": {"S": "Fido"},
"Vaccinations": {
"M": {
"Rabies": {
"L": [
{"S": "2009-03-17"},
{"S": "2011-09-21"},
{"S": "2014-07-08"}
]
},
"Distemper": {"S": "2015-10-13"}
}
}}};
var marshalled = AWS.DynamoDB.Converter.unmarshall(data);
谢谢@charlietfl。你的回答对我需要处理的所有案件都很好。我确实进一步研究了AWS文档中用于DynamoDB的高级接口SDK——似乎有用于Java和.Net的SDK,但没有javascript。可能会有第三方SDK,但您的建议看起来快速有效,满足了我的需要。我唯一想知道的是,您是否可以在同一级别的一个对象中获得两个描述符。如果是这样的话,这将对你不利。我接受了这个答案,因为它直接解决了我提出的问题。然而,正如建议的那样,我实际上已经将代码更改为使用AWS Javascript SDK中的document Clientby@bwinant. 我认为每个级别应该只有一个描述符,但我可能被证明是错误的。正如OP提到的,他在阅读文档后使用查询函数来检索结果和事件,没有什么可以改变这样一个事实,即这些结果将随数据类型一起出现。DocumentClient返回“正常”外观的JS对象(没有类型描述符)作为其所有方法的结果:scan、get、query等。这不是真的,它实际上取决于您如何构建查询、scan等。例如,如果您将属性与“:createdAt”:{s:“02/09/2019”}一起使用,则结果将始终返回其数据类型,否则如果您使用“:createdAt”:“02/09/2019”结果将没有数据类型。我认为如果他展示了查询get是如何构建的,那么回答OP问题会更好。OP问题非常清楚,他使用的是一个查询函数,它与get或put函数不同,get将为您获取单个项,而不提其他差异。