Javascript 从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": "

DynamoDB为查询响应中的每个元素都包含一个数据类型描述符,如下所示:

"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将为您获取单个项,而不提其他差异。