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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:47:30