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

如何在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
}

代码说明

  1. Array2预处理步骤:

    • groupBy ($.sid):将Array2按sid字段分组,生成以sid为键、对应匹配数组为值的对象
    • mapObject + value[-1]:遍历每个分组,只保留分组内的最后一条记录
    • pluck $:将分组后的对象转换回数组,得到每个sid仅对应一条最新记录的数据集
  2. 左连接操作:

    • 使用预处理后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:15:32