【问题标题】:Parsing DynamoDB Request解析 DynamoDB 请求
【发布时间】:2021-03-04 05:38:05
【问题描述】:

我的目标是递归解析来自dynamo.getItem 方法的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"
          }
        }
      }
    }
  }
}

我需要一个将上述 JSON 映射为更短版本的 JavaScript 函数:

{  
    "id": "4",
    "number": "1",
    "data": { 
        "aaa": "AAA",
        "lv2": {    
            "lv3": { 
                "ccc": "111"
            },
            "bbb": "BBB"
        }
    }
}

这通常是一个 JavaScript 问题,但我想有 DynamoDB 经验的人可能知道如何处理这个问题。

有什么想法吗?

【问题讨论】:

    标签: javascript json node.js amazon-web-services amazon-dynamodb


    【解决方案1】:

    aws-sdk 现在支持使用 AWS.DynamoDB.Converter 编组/解组数据。 请参阅此处的文档: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/Converter.html

    2018 年 1 月 7 日更新:此转换器代码内置于 AWS.DynamoDB.DocumentClient,因此无需直接使用 Converter.marshallConverter.Unmarshall。看: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html

    【讨论】:

      【解决方案2】:

      如果您使用的是节点,有一个很酷的包可以执行 dynamo-to-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'}] 
      });
      

      【讨论】:

      • 这个包已经被并入 aws-sdk:AWS.DynamoDB.Converter.unmarshall(data.Item);
      【解决方案3】:

      如果您使用的是@aws-sdk/client-dynamodb (npm),那么您可以将其与来自@aws-sdk/util-dynamodbunmarshall 方法配对。

      例如:

      const { DynamoDBClient, GetItemCommand } = require("@aws-sdk/client-dynamodb");
      const { marshall, unmarshall } = require("@aws-sdk/util-dynamodb");
      
      (async () => {
        const client = new DynamoDBClient({ region: "eu-west-2" });
        const params = {
          Key: marshall({
            HashKey: "KeyName",
          }),
          TableName: "my-table",
        };
        const command = new GetItemCommand(params);
        const { Item } = await client.send(command);
        const POJO = unmarshall(Item); // POJO is without types :)
      })();
      

      【讨论】:

        【解决方案4】:

        很晚才回答这个问题,希望以后能对其他人有所帮助。

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2018-12-15
            • 2018-06-02
            • 2019-05-03
            • 1970-01-01
            • 1970-01-01
            • 2020-12-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多