首页 > 解决方案 > Mulesoft dataweave 外连接

问题描述

在使用 DataWeave 2.0 转换如下消息时需要您的帮助。

如果我有以下用户和订单的 JSON 有效负载。需要的输出是有订​​单的用户列表(内连接)和没有订单的用户。如果用户的订单不在订单列表中,则该列表不应包含用户数据。

我尝试使用 dataweave 的外连接,但这会拉出有订单但也不存在于订单列表中的用户。

请在下面找到示例。

var users = [
{
  "id": "1",
  "name": "Jerney",
  "order_id": "101",
},
{
  "id": "2",
  "name": "Marty"
  "order_id": "102",
},
{
  "id": "3",
  "name": "Marty"
}
]


var orders = [
{
   "order_id": "101",
   "product": "bread"
},
{
   "order_id": "104",
   "product": "broccoli"
}

]

需要的输出是

[
{
  "id": "1",
  "name": "Jerney",
  "order_id": "101",
  "product": "bread"
}
{
  "id": "3",
  "name": "Marty"
}
]

我希望示例清除预期的输出。我尝试了过滤(如外部连接),但它也会在输入中包含订单 ID 102。

谢谢你的帮助!

标签: dataweavemulesoft

解决方案


我找到了一种方法来实现这一点,但是在我的测试中我遇到了一些奇怪的问题,即使在过滤它之后,连接中也缺少一个 order_id。我使用了额外的地图来解决问题。它不应该是必需的。此脚本准确返回您想要的输出。

%dw 2.0
output application/json
import * from dw::core::Arrays
var users = [
    {
        "id": "1",
        "name": "Jerney",
        "order_id": "101"
    },
    {
        "id": "2",
        "name": "Marty",
        "order_id": "102"
    },
    {
        "id": "3",
        "name": "Marty"
    } 
]

var orders = [
    {
        "order_id": "101",
        "product": "bread"
    },
    {
        "order_id": "104",
        "product": "broccoli"
    }
]

fun getUserWithOrders(users) = (users filter $.order_id?) 
        map ($ mapObject ($$):$) // for some reason had to add this to avoid a null error in the join

fun getUserWithoutOrders(users) = (users filter not $.order_id?) 
---
join(getUserWithOrders(users), orders, (u) -> u.order_id, (o) -> o.order_id)
    map ($.l ++ {product: $.r.product})
    ++ getUserWithoutOrders(users)

推荐阅读