【问题标题】:Mulesoft dataweave outer joinMulesoft dataweave 外连接
【发布时间】:2021-01-23 12:54:36
【问题描述】:

在使用 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。

感谢您的帮助!

【问题讨论】:

    标签: dataweave mulesoft


    【解决方案1】:

    我找到了一种方法来实现这一点,但在我的测试中我遇到了一些奇怪的问题,即连接中缺少一个 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)
    

    【讨论】:

      【解决方案2】:

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

      %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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-22
        • 1970-01-01
        • 2016-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多