Mulesoft中左连接后如何获取最后一条匹配记录

问题描述 投票:0回答:1

我们必须从 Array1 中获取所有记录,并从 Array2 中获取最后匹配的记录。我尝试了 dataweave 中的 leftJoin 但它匹配 Array2 中的所有记录。

数组1:

    [
        { 
            "name": "Abc", 
            "address":"Mumbai",
            "phone":"91-1234567891",
            "id":123
        }, 
        { 
            "name": "Pqr", 
            "address":"Pune",
            "phone":"91-1234985438",
            "id":456
        }, 
        { 
            "name": "Abc",
            "address":"Delhi",
            "phone":"91-1234567891",
            "id":123
        }
    ]

数组2:

[
    { 
        "sid":123,
        "postalCode": "67890",
        "country": "USA"
    }, 
    { 
        "sid":456,
        "postalCode": "54983",
        "country": "UK"
    }, 
    { 
        "sid":123,
        "postalCode": "27932",
        "country": "EU"
    }
]

这里 id=123 与 Array2 中的 2 条记录匹配,但我们必须获取最后一个匹配的记录。

预期输出:

[
  {
    "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"
  }
]

输出应具有与 Array1 中相同的记录数(即 3 条记录),并与 Array2 中的最后一个匹配记录匹配,即使出现 2 次也是如此。

我尝试了下面的 leftJoin,但我在输出中得到了超过 3 个匹配记录。

%dw 2.0
output application/json
import * from dw::core::Arrays
---
(leftJoin(Array1, Array2, (Array1) -> Array1.id, (Array2) -> Array2.sid)) map {
    "name": $.l.name, 
    "address": $.l.address,
    "phone": $.l.phone,
    "id": $.l.id,
    "sid": $.r.sid,
    "postalCode": $.r.postalCode,
    "country": $.r.country
}
left-join unique dataweave mulesoft
1个回答
0
投票

问题是 Array2 中存在具有相同

sid
的重复元素,并且如果有多个选项,您希望使用 Array2 的最后一个可能的元素。您的脚本在这方面没有做任何事情。为了避免这些问题,我首先颠倒 Array2 的顺序,因此最后一个元素是第一个,然后使用
distinctBy()
删除重复项。我只是使用新排序的唯一数组来代替。

%dw 2.0
output application/json
import * from dw::core::Arrays

var Array1=[
        { 
            "name": "Abc", 
            "address":"Mumbai",
            "phone":"91-1234567891",
            "id":123
        }, 
        { 
            "name": "Pqr", 
            "address":"Pune",
            "phone":"91-1234985438",
            "id":456
        }, 
        { 
            "name": "Abc",
            "address":"Delhi",
            "phone":"91-1234567891",
            "id":123
        }
    ]
var Array2=[
  {
    "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"
  }
]

var Array2reversed=Array2[-1 to 0] distinctBy ((item, index) -> item.sid)

---
(leftJoin(Array1, Array2reversed, (Array1) -> Array1.id, (Array2) -> Array2.sid)) 
    map {
        "name": $.l.name, 
        "address": $.l.address,
        "phone": $.l.phone,
        "id": $.l.id,
        "sid": $.r.sid,
        "postalCode": $.r.postalCode,
        "country": $.r.country
    }

输出:

[
  {
    "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"
  }
]
© www.soinside.com 2019 - 2024. All rights reserved.