如何配置 AWS AppSync 架构以处理 DynamoDB 中的嵌套 JSON 数据?

上次更新日期:2022 年 10 月 7 日

我希望我的 AWS AppSync 架构能够从具有嵌套 JSON 数据的 Amazon DynamoDB 表中检索响应。该如何操作?

简短描述

要获取 AWS AppSync 架构来处理 DynamoDB 中的嵌套 JSON 数据,请执行以下操作:

  • 将嵌套 JSON 数据项添加到 DynamoDB 表中。
  • 创建 AWS AppSync API 并附加数据源。
  • 在 AWS AppSync API 中配置嵌套的 JSON 架构。
  • 将解析器附加到 getItems 查询。
  • 创建新的测试查询。

重要提示:如果字段名称未映射到嵌套的 JSON 数据,AWS AppSync 架构会在将 null 值传递到对 DynamoDB 的响应中。

解决方法

将嵌套 JSON 数据项添加到 DynamoDB 表中

    1.    打开 Amazon DynamoDB 控制台

    2.    选择 Create table(创建表)。

    3.    在 Table name(表名)字段中,输入描述性名称。

    4.    在 Partition key(分区键)字段中,输入字段名称。例如: id

    5.    选择 Create table(创建表)。新表将显示在控制台的 Tables(表)页面上。

    6.    在 Name(名称)列中,选择新表的名称。表的 Overview(概览)页面随即打开。

    7.    选择 Actions(操作)下拉列表。然后选择 Create item(创建项目)。这将打开 Create item(创建项目)页面。

    8.    选择 JSON 按钮。

    9.    复制以下嵌套 JSON 记录并粘贴到 JSON 编辑器中,然后选择 Save(保存):

    重要提示: 确保使用嵌套 JSON 记录覆盖 JSON 编辑器中预填充的内容。

    示例嵌套 JSON 记录

    {
      "id": "123",
      "product": {
        "model": {
          "property": {
            "battery": "li-ion",
            "device": "iOT-Device",
            "pressure": "1012",
            "up_time": "02:12:34"
          }
        }
      },
      "status": "In-Stock"
    }

    有关更多信息,请参阅创建表

    创建 AWS AppSync API 并附加数据源

      1.    打开 AWS AppSync 控制台

      2.    选择创建 API

      3.    在 Getting Started(入门)页面中的 Customize your API or import from Amazon DynamoDB(自定义 API 或从 Amazon DynamoDB 中导入)下选择 Build from scratch(从头开始构建)。

      4.    选择 Start(开始)。

      5.    在 API name(API 名称)字段中,输入 API 的名称。

      6.    选择 Create(创建)。

      7.    在左侧导航窗格中,选择 Data Sources(数据源)。

      8.    选择 Create data source(创建数据源)。

      9.    在 New Data Source(新数据源)页面上的 Create new Data Source(创建新数据源)下选择以下选项:对于 Data source name(数据源名称),请输入描述性名称。对于 Data source type(数据来源类型),请选择 Amazon DynamoDB table(Amazon DynamoDB 表)。对于 Region(区域),选择包含您的 DynamoDB 表的区域。对于 Table name(表名称),选择您刚创建的表。

      重要提示:将所有其他选项保留为默认选项。

      10.    选择 Create(创建)。

      有关更多信息,请参阅附加数据源

      在 AWS AppSync API 中配置嵌套的 JSON 架构

      1.    打开 AWS AppSync 控制台

      2.    在左侧导航窗格中,选择 Schema(架构)。

      3.    复制以下嵌套 JSON 架构并粘贴到 JSON 编辑器中,然后选择 Save Schema(保存架构):

      重要提示: 确保使用嵌套 JSON 架构覆盖 JSON 编辑器中预填充的内容。

      示例嵌套 JSON 架构

      type Query {
          getItems(id: String!): allData
      }
      
      type allData {
          id: String!
          product: toModel
          status: String
      }
      
      type items {
          battery: String
          device: String
          pressure: String
          up_time: String
      }
      
      schema {
          query: Query
      }
      
      type toModel {
          model: toProperties
      }
      
      type toProperties {
          property: items
      }

      有关更多信息,请参阅设计架构

      将解析器附加到 getItems 查询

      1.    打开 AWS AppSync 控制台

      2.    在 API 的 Schema(架构)页面的 Resolvers(解析器)下,滚动到 Query(查询)。
      注意: 或者在 Filter types(筛选器类型)字段中,输入 Query(查询)。

      3.    在 getItems(...): allData 旁的 Resolver(解析器)下,选择 Attach(附加)。

      4.    在 Create new Resolver(创建新解析器)页面上,对于 Data source name(数据源名称),选择您已创建的 DynamoDB 表的名称。

      重要提示:请勿更改 DynamoDB GetItem 操作的默认映射模板。

      5.    选择 Save Resolvers(保存解析器)。

      示例请求映射模板

      {
          "version": "2017-02-28",
          "operation": "GetItem",
          "key": {
              "id": $util.dynamodb.toDynamoDBJson($ctx.args.id),
          }
      }

      示例响应映射模板

      $util.toJson($ctx.result)

      有关更多信息,请参阅配置解析器

      创建新的测试查询

      1.    打开 AWS AppSync 控制台

      2.    在左侧导航窗格中,选择 Queries(查询)。

      3.    在 API 的 Queries(查询)页面中的 Query editor(查询编辑器)中,复制并粘贴以下查询:

      示例测试查询

      query getItem {
          getItems(id:"123") {
            id
            product{
                model{
                  property{
                  pressure 
                  device
                  battery
                  up_time
                }
              }
            }
            status
          }
        }

      4.    要运行测试查询,选择 play icon(播放图标)或者按下 Ctrl/Cmd + Enter

      示例测试查询结果

      {
        "data": {
          "getItems": {
            "id": "123",
            "product": {
              "model": {
                "property": {
                  "pressure": "1012",
                  "device": "iOT-Device",
                  "battery": "li-ion",
                  "up_time": "02:12:34"
                }
              }
            },
            "status": "In-Stock"
          }
        }
      }

      现在,您可以通过 AWS AppSync GraphQL 操作从 Amazon DynamoDB 表检索任何嵌套 JSON 数据。