Mulesoft中将3个Salesforce查询结果按关联字段合并为一个Payload
Mule AnyPoint Studio Salesforce多表合并方案
场景说明
你通过Scatter Gather组件并行查询得到了三类Salesforce表数据:
payload[0]:父表数组,核心匹配字段为ParentIdpayload[1]:关系表数组,核心匹配字段为ParentId、ChildIdpayload[2]:子表数组,核心匹配字段为ChildId
需合并为同层级结构,且支持一个父级对应多个子级的场景。
实现代码(Transform Message组件使用,DataWeave 2.0语法)
%dw 2.0 output application/json --- // 先构建匹配用的映射表,提高查询效率 var relationByParentId = payload[1] groupBy ((item) -> item.ParentId as String) // 统一转字符串避免类型匹配问题 var childByChildId = payload[2] groupBy ((item) -> item.ChildId as String) mapObject ((value, key) -> (key): value[0]) // 一个ChildId对应一条子表记录 // 遍历父表,关联关系和子表数据 payload[0] flatMap ((parentItem) -> // 取当前父ID对应的所有关系记录 (relationByParentId[parentItem.ParentId] default []) map ((relationItem) -> // 匹配关系对应的子表记录 var childItem = childByChildId[relationItem.ChildId as String] default {} // 合并三个表的所有字段,同名字段默认后面的覆盖前面的,可按需调整顺序 parentItem ++ relationItem ++ childItem ) )
代码说明
- 提前将关系表按
ParentId分组、子表按ChildId做索引,避免嵌套遍历导致的性能问题,数据量大时也可正常运行 - 用
flatMap处理1父多子的场景,会自动将同一个父级对应的多个子级合并结果展开为平级数组 - 匹配时增加了
default []/default {}的兼容逻辑,无匹配关系/子表数据的父级记录不会报错,可按需调整过滤逻辑 - 字段合并顺序为
父表字段>关系表字段>子表字段,如果有同名字段要保留特定表的内容,调整++前后的顺序即可
示例输出
输入你提供的三条测试数据,运行后得到的结果符合预期:
[ { "ParentId": "0cE3S0000000HVGUA2", "Name": "job's Pharmacy", "Address": "123 4th Ave", "ParentLicense": "PHARM.PF.12345678", "ChildId": "0cE3S0000000GscUAE", "RelationStatus": "Site Branch", "ChildLicense": "PHRM.PF.98765432-MHOUT", "ExpirationDate": "2019-02-28", "PublicStatusDescription": "Closed" } ]
内容的提问来源于stack exchange,提问作者robbins
相关产品推荐
相关产品推荐

