Mulesoft数据编织外连接



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

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

我尝试使用outerjoin from 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以及在输入。

谢谢你的帮助!

我找到了一种实现这一目标的方法,但我在测试中遇到了一些奇怪的问题,即使在过滤它之后,也缺少连接中的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)

我建议如下(解释嵌入在代码中):

%dw 2.0
output application/json
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"
}
]
import leftJoin from dw::core::Arrays
---
// Do a left outer join to get all data from the users in the output
leftJoin(
users,
orders,
(u) -> u.order_id default "",
(o) -> o.order_id default ""
)
// Iterate over the data and via pattern matching detect:
//   1. whether you have data in the l and the r nodes where 
//      you concatenate them and add them to the results
//   2. whether a sole l node has an order_id fields where
//      you add them to the result
//   3. throw aways all else
reduce (e,acc=[]) -> e match {
case node if (node.l? and node.r?) -> acc + (node.l ++ node.r - "orderBy")
case node if (node.l.order_id?) -> acc + node.l
else node -> acc
}

最新更新