Javascript 解析DynamoDB请求

Javascript 解析DynamoDB请求,javascript,json,node.js,amazon-web-services,amazon-dynamodb,Javascript,Json,Node.js,Amazon Web Services,Amazon Dynamodb,我的目标是递归地解析来自dynamo.getItem方法的DynamoDB请求 不幸的是,我在dynamodbsdk for Node.js中找不到类似的方法 我正在寻找一种从结果中删除类型的有效方法。在DynamoDB中,键是属性的单字母名称,如“N”、“S”、“M” 这些类型的说明: N means DynamoDB Number type S means dynamoDB String type M means DynamoDB Map type (object with propert

我的目标是递归地解析来自
dynamo.getItem
方法的
DynamoDB
请求

不幸的是,我在dynamodbsdk for Node.js中找不到类似的方法

我正在寻找一种从结果中删除类型的有效方法。在DynamoDB中,键是属性的单字母名称,如“N”、“S”、“M”

这些类型的说明:

N means DynamoDB Number type
S means dynamoDB String type
M means DynamoDB Map type (object with properties)
当前的JSON结构是:

{  
  "id":{  
    "N":"4"
  },
  "number":{  
    "N":"1"
  },
  "data":{  
    "M":{  
      "aaa":{  
        "S":"AAA"
      },
      "lv2":{  
        "M":{  
          "lv3":{  
            "M":{  
              "ccc":{  
                "N":"111"
              }
            }
          },
          "bbb":{  
            "S":"BBB"
          }
        }
      }
    }
  }
}
我需要一个JavaScript函数将上述JSON映射到一个较短的版本:

{  
    "id": "4",
    "number": "1",
    "data": { 
        "aaa": "AAA",
        "lv2": {    
            "lv3": { 
                "ccc": "111"
            },
            "bbb": "BBB"
        }
    }
}
这通常是一个JavaScript问题,但我想有DynamoDB经验的人可能知道如何处理这个问题


有什么想法吗?

如果您使用node,有一个很酷的软件包,它可以将dynamo转换为json编组和解编,这对我来说非常有用:

对象的基本封送处理

var AWS = require('aws-sdk');
var marshalItem = require('dynamodb-marshaler').marshalItem;

AWS.config.region = 'us-west-2';
var dynamoDb = new AWS.DynamoDB();

dynamoDb.putItem({
  TableName: 'users',
  Item: marshalItem({username: 'nackjicholson'})  // {username: {S: 'nackjicholson'}} 
});
var AWS = require('aws-sdk');
var unmarshalItem = require('dynamodb-marshaler').unmarshalItem;

AWS.config.region = 'us-west-2';
var dynamoDb = new AWS.DynamoDB();

var data = dynamoDb.scan({
  TableName: 'users'
}, function(err, data) {
  // data.Items = [{username: {S: 'nackjicholson'}] 
  var items = data.Items.map(unmarshalItem);
  console.log(items); // [{username: 'nackjicholson'}] 
});
对象的基本解组

var AWS = require('aws-sdk');
var marshalItem = require('dynamodb-marshaler').marshalItem;

AWS.config.region = 'us-west-2';
var dynamoDb = new AWS.DynamoDB();

dynamoDb.putItem({
  TableName: 'users',
  Item: marshalItem({username: 'nackjicholson'})  // {username: {S: 'nackjicholson'}} 
});
var AWS = require('aws-sdk');
var unmarshalItem = require('dynamodb-marshaler').unmarshalItem;

AWS.config.region = 'us-west-2';
var dynamoDb = new AWS.DynamoDB();

var data = dynamoDb.scan({
  TableName: 'users'
}, function(err, data) {
  // data.Items = [{username: {S: 'nackjicholson'}] 
  var items = data.Items.map(unmarshalItem);
  console.log(items); // [{username: 'nackjicholson'}] 
});
很晚才回答这个问题,希望以后能对别人有所帮助

AWS为DynamoDb提供了基于模式的库,它支持数据映射器、数据映射器注释、投影表达式、数据封送和取消封送

示例代码段

import {
    attribute,
    autoGeneratedHashKey,
    rangeKey,
    table,
    versionAttribute,
} from '@aws/dynamodb-data-mapper-annotations';

@table('my_table')
class MyDomainClass {
    @autoGeneratedHashKey()
    id: string;

    @rangeKey({defaultProvider: () => new Date()})
    createdAt: Date;

    @versionAttribute()
    version: number;

    @attribute()
    toggle?: boolean;

    @attribute({memberType: 'String'})
    tags?: Set<string>;

    // This property will not be saved to DynamoDB.
    notPersistedToDynamoDb: string;
}

// fetch an object
const toGet = new MyDomainClass();
toGet.id = 'ID_TO_FETCH';
const fetched = await mapper.get(toGet);
导入{
属性
自动生成hashkey,
兰奇,
桌子
版本属性,
}来自“@aws/dynamodb数据映射器注释”;
@表(“我的表”)
类MyDomainClass{
@自动生成的hashkey()
id:字符串;
@rangeKey({defaultProvider:()=>new Date()})
createdAt:日期;
@versionAttribute()
版本:编号;
@属性()
切换?:布尔值;
@属性({memberType:'String'})
标签?:设置;
//此属性将不会保存到DynamoDB。
notPersistedToDynamoDb:字符串;
}
//取回一个对象
const toGet=新的MyDomainClass();
toGet.id='id_TO_FETCH';
const fetched=wait mapper.get(toGet);

其他选项是创建自定义地图:

const items = data.Items.map(
    (item) => {
        return {
            id: item.id.N,
            number: item.number.N,
            data: {
               aaa: item.data.M.aaa.S,
               lv2: {
                   lv3: {
                       ccc: item.data.M.lv2.M.lv3.M.ccc.N
                   },
                   bbb: item.data.M.lv2.M.bbb.S
               }
            }
        }
    }
);

aws sdk现在支持使用
aws.DynamoDB.Converter
对数据进行marshall/unmarshall处理。 请参见此处的文档:

2018年1月7日更新:此转换器代码内置于AWS.DynamoDB.DocumentClient中,因此无需直接使用
converter.marshall
converter.Unmarshall
。见:

如果您正在使用(),则可以将其与来自的
解组方法配对

例如:

const{DynamoDBClient,GetItemCommand}=require(“@aws-sdk/client-dynamodb”);
const{marshall,unmarshall}=require(@aws-sdk/util-dynamodb);
(异步()=>{
const client=新的DynamoDBClient({地区:“eu-west-2”});
常量参数={
关键词:马歇尔({
HashKey:“KeyName”,
}),
TableName:“我的桌子”,
};
const命令=新的GetItemCommand(参数);
const{Item}=wait client.send(命令);
const POJO=unmarshall(Item);//POJO没有类型:)
})();

此软件包已并入aws sdk:
aws.DynamoDB.Converter.unmarshall(data.Item)