dataweave - 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。
谢谢你的帮助!
解决方案
我找到了一种方法来实现这一点,但是在我的测试中我遇到了一些奇怪的问题,即使在过滤它之后,连接中也缺少一个 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)
推荐阅读
- javascript - 如何将数字 API 输入为字符串或我将在哪里放置 toString()
- css - 离子如何将离子含量与页面底部对齐
- vue.js - Vuetify v-data-table 双击事件不起作用
- javascript - 用 Jest 进行反应测试:解构分配不起作用
- python - 用特定年份对应的 Quantity 平均值填充 NaN 值
- javascript - OrderBy 时间戳 desc Firestore
- reactjs - Firefox 和 Safari 中的传单缓慢拖动问题
- c# - c#当多个用户从远程源引用同一个对象时如何锁定对象
- python - 将文件名拆分为 pyspark 数据框的不同列
- r - 实现“在 tibble 列中分离值然后创建新列并将值放在那里”的最有效方法是什么?