如何在MuleSoft中左连接后获取最后一条匹配记录
解决MuleSoft DataWeave左连接仅关联Array2最后一条匹配记录的问题
问题分析
直接使用leftJoin会将Array1的每条记录与Array2中所有匹配条件的记录关联,导致输出记录数超出预期。要实现保留Array1全部记录,仅关联Array2对应条件的最后一条匹配记录,核心是先对Array2做预处理:按关联字段分组,每组只保留最后一条记录,再执行左连接。
解决方案代码
%dw 2.0 output application/json import * from dw::core::Arrays --- // 预处理Array2:按sid分组后保留每组最后一条记录 var processedArray2 = Array2 groupBy ($.sid) mapObject ((value, key) -> { (key): value[-1] // 取分组内最后一条元素 }) pluck $ // 将分组对象转换回数组格式 // 用预处理后的Array2与Array1执行左连接 leftJoin(Array1, processedArray2, (a) -> a.id, (b) -> b.sid) map { name: $.l.name, address: $.l.address, phone: $.l.phone, id: $.l.id, sid: $.r.sid default null, postalCode: $.r.postalCode default null, country: $.r.country default null }
代码说明
Array2预处理步骤:
groupBy ($.sid):将Array2按sid字段分组,生成以sid为键、对应匹配数组为值的对象mapObject + value[-1]:遍历每个分组,只保留分组内的最后一条记录pluck $:将分组后的对象转换回数组,得到每个sid仅对应一条最新记录的数据集
左连接操作:
- 使用预处理后的
processedArray2与Array1执行leftJoin,此时每个id只会对应一条匹配记录 default null:处理Array1中无匹配记录的字段,避免输出异常值
- 使用预处理后的
预期输出
[ { "name": "Abc", "address": "Mumbai", "phone": "91-1234567891", "id": 123, "sid": 123, "postalCode": "27932", "country": "EU" }, { "name": "Pqr", "address": "Pune", "phone": "91-1234985438", "id": 456, "sid": 456, "postalCode": "54983", "country": "UK" }, { "name": "Abc", "address": "Delhi", "phone": "91-1234567891", "id": 123, "sid": 123, "postalCode": "27932", "country": "EU" } ]
内容的提问来源于stack exchange,提问作者Uday
相关产品推荐
相关产品推荐

