2015-01-15 119 views
2

我的目標是從dynamo.getItem方法遞歸解析DynamoDB請求。解析DynamoDB請求

不幸的是,我在DynamoDB SDK for Node.js中找不到類似的方法。

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

我要尋找從結果中移除類型的有效途徑。在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經驗的人可能知道ho解決這個問題。

任何想法?

回答

2

如果您使用節點,有一個很酷的包,做發電機到JSON編組和解組,對我偉大的工作:

https://www.npmjs.com/package/dynamodb-marshaler

基本對象的編組

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'}] 
}); 
0

回答這個問題很晚,希望以後能幫助別人。

AWS爲DynamoDb提供基於模式的庫,它支持數據映射器,數據映射器註釋,投影表達式,數據封送和解封裝。

Amazon DynamoDB DataMapper For JavaScript

示例代碼段

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);