从DynamoDB响应中删除数据类型描述符的推荐方法是什么?

djr*_*s70 5 javascript amazon-web-services amazon-dynamodb aws-lambda

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"}
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想剥离所有这些描述符(“ 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"
     }
}
Run Code Online (Sandbox Code Playgroud)

是否有标准(或推荐)方法来执行此操作?

amb*_*t05 11

他们有一个您可以使用的转换器。

例如,这是他们的示例:

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);
Run Code Online (Sandbox Code Playgroud)

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/Converter.html


cha*_*tfl 5

不熟悉 DynamoDb 的使用。我的猜测是,您可以使用 SDK 来执行此操作,或者查询中的设置可用于关闭描述符

以下似乎适用于您示例中的所有案例

var descriptors = ['L', 'M', 'N', 'S'];

function flatten(o) {

  // flattens single property objects that have descriptors  
  for (let d of descriptors) {
    if (o.hasOwnProperty(d)) {
      return o[d];
    }
  }

  Object.keys(o).forEach((k) => {

    for (let d of descriptors) {
      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 (typeof o[k] === 'object') {
      o[k] = flatten(o[k])
    }
  });

  return o;
}

data = flatten(data)
console.log(data)
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper {
  max-height: 100%;
}
Run Code Online (Sandbox Code Playgroud)
<script>
  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"}}}}};
</script>
Run Code Online (Sandbox Code Playgroud)