Mule 4中合并JSON元素:SQL查询结果结构化转换需求
Mule 4 DataWeave: Merge Duplicate School Records into a Single Object with Nested Emails Array
你要实现的是把SQL查询返回的多条重复学校记录(因为关联了多个邮箱)合并成单个学校对象,同时把多个邮箱信息整理成嵌套的Emails数组。在Mule 4的DataWeave里,用分组加转换的方式就能轻松搞定,具体步骤如下:
实现思路
- 按公共唯一标识分组:用
groupBy函数按RefId(学校唯一ID)把输入数组的元素分组,这样每个分组里的所有记录都属于同一个学校。 - 转换分组数据:对每个分组,提取重复的学校基础字段,再把每个记录里的邮箱相关字段收集成单独的数组。
完整DataWeave代码示例
假设你的SQL查询结果存在payload变量中,转换代码如下:
%dw 2.0 output application/json --- (payload groupBy $.RefId) pluck ((groupedItems, refId) -> { RefId: refId, LocalId: groupedItems[0].LocalId, StateProvinceId: groupedItems[0].StateProvinceId, SchoolName: groupedItems[0].SchoolName, Emails: groupedItems map ((item) -> { Email: item.Email, EmailType: item.EmailType }) })[0]
代码逐行解释
payload groupBy $.RefId:将输入数组按RefId字段分组,得到一个以RefId为键、对应学校所有记录为值的对象。pluck ((groupedItems, refId) -> { ... }):遍历分组后的对象,把每个键值对转换成我们需要的目标结构。- 提取基础学校字段:同一个分组里的学校基础字段(LocalId、StateProvinceId等)都是重复的,直接取分组中第一个元素的对应字段即可。
- 生成Emails数组:用
map函数遍历分组内的每条记录,只保留Email和EmailType字段,组成嵌套的数组。 [0]:因为你的SQL查询条件是s.RefId = :ref_id,所以分组后只会有一个学校的记录,取数组第一个元素就得到最终的单个学校对象。
扩展场景说明
如果你的SQL查询去掉WHERE条件,可能返回多个学校的记录,那只需去掉代码末尾的[0],这样会返回一个包含所有合并后学校对象的数组,每个对象都带有自己的Emails数组。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

