在dataweave中保留数据库输出排序
Preserve the database output sort in dataweave
我有一个要求,要求 dataweave 输出按特定顺序排列。
这是我必须处理的数据库输出
[
{
"order": "Order 2",
"inv": 6150579.00000,
"dio": 31,
"week": "2020-06-01T00:00:00"
},
{
"order": "Order 2",
"inv": 6318049.21000,
"dio": 33,
"week": "2020-06-08T00:00:00"
},
{
"order": "Order 1",
"inv": 6306077.76000,
"dio": 45,
"week": "2020-06-01T00:00:00"
},
{
"order": "Order 1",
"inv": 6047050.75000,
"dio": 43,
"week": "2020-06-08T00:00:00"
},
]
在数据库查询中,我写了条件,以便根据特定的顺序条件对其进行排序。在这种情况下,例如订单“12345 - 订单 1”必须首先出现在输出中。
但是当我使用 groupBy 条件转换 dataweave 中的输出时,排序顺序已更改
payload map {
"order" : $.order,
"inv" : $.inv,
"dio" : $.dio,
"week" : $.week
} groupBy $.order
输出:
{
"Order 1": [
{
"order": "Order 1",
"inv": 6306077.76000,
"dio": 45,
"week": "2020-06-01T00:00:00"
},
{
"order": "Order 1",
"inv": 6047050.75000,
"dio": 43,
"week": "2020-06-08T00:00:00"
}
],
"Order 2": [
{
"order": "Order 2",
"inv": 6150579.00000,
"dio": 31,
"week": "2020-06-01T00:00:00"
},
{
"order": "Order 2",
"inv": 6318049.21000,
"dio": 33,
"week": "2020-06-08T00:00:00"
}
]
}
您看到订单 1 值排在第一位。
这是我编造的例子。实际上我有数百个数据。
在这种情况下,按 $$ 排序也是错误的。
groupBy() 不保证任何顺序。如果没有明确提及,您不应该假设任何操作都会保留顺序。您必须明确订购输出:
%dw 2.0
output application/json
---
payload map {
"order" : $.order,
"inv" : $.inv,
"dio" : $.dio,
"week" : $.week
} groupBy $.order
mapObject (($$): $ orderBy -$.inv ) // order inside each group by inv descending order
orderBy $$ // order the groups by key
更新:根据评论,我更改了脚本以按相反顺序按 inv
属性对每个组进行排序。
更新 2:我还按键排序了每个组,所以 'Order 1' 在 'Order 2' 之上。
输出:
{
"Order 1": [
{
"order": "Order 1",
"inv": 6306077.76000,
"dio": 45,
"week": "2020-06-01T00:00:00"
},
{
"order": "Order 1",
"inv": 6047050.75000,
"dio": 43,
"week": "2020-06-08T00:00:00"
}
],
"Order 2": [
{
"order": "Order 2",
"inv": 6318049.21000,
"dio": 33,
"week": "2020-06-08T00:00:00"
},
{
"order": "Order 2",
"inv": 6150579.00000,
"dio": 31,
"week": "2020-06-01T00:00:00"
}
]
}
我有一个要求,要求 dataweave 输出按特定顺序排列。
这是我必须处理的数据库输出
[
{
"order": "Order 2",
"inv": 6150579.00000,
"dio": 31,
"week": "2020-06-01T00:00:00"
},
{
"order": "Order 2",
"inv": 6318049.21000,
"dio": 33,
"week": "2020-06-08T00:00:00"
},
{
"order": "Order 1",
"inv": 6306077.76000,
"dio": 45,
"week": "2020-06-01T00:00:00"
},
{
"order": "Order 1",
"inv": 6047050.75000,
"dio": 43,
"week": "2020-06-08T00:00:00"
},
]
在数据库查询中,我写了条件,以便根据特定的顺序条件对其进行排序。在这种情况下,例如订单“12345 - 订单 1”必须首先出现在输出中。
但是当我使用 groupBy 条件转换 dataweave 中的输出时,排序顺序已更改
payload map {
"order" : $.order,
"inv" : $.inv,
"dio" : $.dio,
"week" : $.week
} groupBy $.order
输出:
{
"Order 1": [
{
"order": "Order 1",
"inv": 6306077.76000,
"dio": 45,
"week": "2020-06-01T00:00:00"
},
{
"order": "Order 1",
"inv": 6047050.75000,
"dio": 43,
"week": "2020-06-08T00:00:00"
}
],
"Order 2": [
{
"order": "Order 2",
"inv": 6150579.00000,
"dio": 31,
"week": "2020-06-01T00:00:00"
},
{
"order": "Order 2",
"inv": 6318049.21000,
"dio": 33,
"week": "2020-06-08T00:00:00"
}
]
}
您看到订单 1 值排在第一位。
这是我编造的例子。实际上我有数百个数据。 在这种情况下,按 $$ 排序也是错误的。
groupBy() 不保证任何顺序。如果没有明确提及,您不应该假设任何操作都会保留顺序。您必须明确订购输出:
%dw 2.0
output application/json
---
payload map {
"order" : $.order,
"inv" : $.inv,
"dio" : $.dio,
"week" : $.week
} groupBy $.order
mapObject (($$): $ orderBy -$.inv ) // order inside each group by inv descending order
orderBy $$ // order the groups by key
更新:根据评论,我更改了脚本以按相反顺序按 inv
属性对每个组进行排序。
更新 2:我还按键排序了每个组,所以 'Order 1' 在 'Order 2' 之上。
输出:
{
"Order 1": [
{
"order": "Order 1",
"inv": 6306077.76000,
"dio": 45,
"week": "2020-06-01T00:00:00"
},
{
"order": "Order 1",
"inv": 6047050.75000,
"dio": 43,
"week": "2020-06-08T00:00:00"
}
],
"Order 2": [
{
"order": "Order 2",
"inv": 6318049.21000,
"dio": 33,
"week": "2020-06-08T00:00:00"
},
{
"order": "Order 2",
"inv": 6150579.00000,
"dio": 31,
"week": "2020-06-01T00:00:00"
}
]
}