首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mulesoft数据编织外连接

Mulesoft数据编织外连接
EN

Stack Overflow用户
提问于 2021-01-23 20:54:37
回答 2查看 91关注 0票数 1

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

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

我尝试使用来自dataweave的outerjoin,但这将拉出具有订单但不在订单列表中的用户。

请找到下面的示例。

代码语言:javascript
复制
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"
}

]

所需的输出为

代码语言:javascript
复制
[
{
  "id": "1",
  "name": "Jerney",
  "order_id": "101",
  "product": "bread"
}
{
  "id": "3",
  "name": "Marty"
}
]

我希望这个例子能清楚地说明预期的输出。我尝试过过滤(如外部连接),但它也会在输入中包含order id 102。

谢谢你的帮忙!

EN

回答 2

Stack Overflow用户

发布于 2021-01-23 21:28:08

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

代码语言:javascript
复制
%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)
票数 1
EN

Stack Overflow用户

发布于 2021-01-23 22:48:06

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

代码语言:javascript
复制
%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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65859437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档