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)代码>