如何创建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
相关产品推荐
相关产品推荐

