You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建AppSync解析器为列表项追加DocumentDB关联资产数据?

解决方案:AppSync解析器关联DocumentDB中DeviceData与Asset数据

1. 调整GraphQL Schema(可选但推荐)

先在DeviceData类型中新增关联的Asset字段,让Schema结构更清晰:

type Asset {
  id: ID!
  name: String!
  # 其他Asset相关字段...
}

type DeviceData {
  id: ID!
  assetID: ID!
  value: Float!
  # 新增关联资产字段
  asset: Asset
  # 其他DeviceData相关字段...
}

type Query {
  findDevicesQuery: [DeviceData]
}

2. 配置DocumentDB数据源

在AppSync控制台创建DocumentDB数据源,完成集群连接信息(VPC、访问凭证等)配置,确保AppSync具备访问DocumentDB集群的权限。

3. 编写findDevicesQuery解析器

解析器分两步执行:先查询所有DeviceData数据,再批量获取对应Asset数据,最后将两者关联返回。

3.1 主解析器请求模板(VTL)

先拉取所有DeviceData数据:

{
  "version": "2018-05-29",
  "statements": [
    "db.DeviceData.find({})"
  ]
}

3.2 主解析器响应模板(VTL,核心关联逻辑)

提取DeviceData中的assetID批量查询Asset,再将资产数据匹配到对应设备数据中:

# 获取查询返回的DeviceData列表
#set $deviceList = $utils.toJson($ctx.result[0])

# 提取非空且去重的assetID集合
#set $assetIds = []
#foreach($device in $deviceList)
  #if($device.assetID && !$utils.list.contains($assetIds, $device.assetID))
    #set $discard = $assetIds.add($device.assetID)
  #end
#end

# 批量查询Asset数据并关联到DeviceData
#if($assetIds.size() > 0)
  # 构造批量查询语句
  #set $assetQuery = "db.Asset.find({_id: {$in: ["
  #foreach($id in $assetIds)
    #set $discard = $assetQuery.append('"').append($id).append('"')
    #if($foreach.hasNext)
      #set $discard = $assetQuery.append(',')
    #end
  #end
  #set $discard = $assetQuery.append("]}})")
  #set $assets = $utils.toJson($utils.documentDB.executeStatement($assetQuery))

  # 将Asset转为Map,实现快速查找
  #set $assetMap = {}
  #foreach($asset in $assets)
    #set $discard = $assetMap.put($asset._id, $asset)
  #end

  # 给每个DeviceData绑定对应的Asset
  #set $result = []
  #foreach($device in $deviceList)
    #set $deviceObj = $utils.toMap($device)
    #if($assetMap.containsKey($device.assetID))
      #set $discard = $deviceObj.put("asset", $assetMap.get($device.assetID))
    #end
    #set $discard = $result.add($deviceObj)
  #end
#else
  # 无关联Asset时直接返回原DeviceData列表
  #set $result = $deviceList
#end

$utils.toJson($result)

4. 关键注意事项

  • 确保DocumentDB中_id字段与GraphQL的id/assetID格式一致(建议统一用字符串类型,避免ObjectID与字符串不匹配)
  • 批量查询用$in操作符减少数据库请求,提升性能
  • 若DeviceData数据量较大,建议添加分页逻辑,避免单次查询数据过多导致性能问题
  • 给AppSync的IAM角色配置DocumentDB的查询权限,确保解析器能正常执行数据库操作

内容的提问来源于stack exchange,提问作者studiobrain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:15:40