如何解决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","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","order_id": "101",},{
"id": "2","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,(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
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。