我在Mule中处理一个相当棘手的数据集,需要使用DataWeave对数组中返回的大量记录进行一些数学运算。我处理的数组如下所示:
[
{
"id": "1",
"type": "AAA",
"metadata": {
"balance": "500"
}
},
{
"id": "2",
"type": "BBB",
"metadata": {
"total": "200"
}
},
{
"id": "3",
"type": "AAA",
"metadata": {
"balance": "-100"
}
}
]
我试图实现的结果如下:
{
"X": 200, //sum (all metadata/balance where type=AAA) - (all metadata/total where type=BBB) ** in this case, (500 + -100)-(200)=400
"Y": 500, //sum all +ve metadata/balance where type=AAA
"Z": 300 //sum (all metadata/total where type=BBB) + (all -ve metadata/balance where type=AAA * -1) ** in this case, (200)+(-100 * -1)=300
}
我已经浏览了尽可能多的文档,并且正在努力寻找答案。为了使事情变得更加尴尬,我需要求和的值在入站消息中以string
格式显示,并且需要在出站消息中以integer
格式显示。
任何指导都将不胜感激。
答案 0 :(得分:0)
这是一种方法。
%dw 1.0
%output application/json
---
using (
aaa = payload[?($.type == "AAA")],
bbbTotal = sum payload[?($.type == "BBB")].metadata.total
) {
X: sum aaa.metadata.balance - bbbTotal,
Y: sum aaa.metadata.balance,
Z: bbbTotal - sum aaa.metadata.balance[?($ < 0)]
}
答案 1 :(得分:0)
试试这个:
%dw 1.0
%output application/json
%function getMetadataByType(type) (payload[?($.type == type)].metadata)
%function sumPositiveBalance(type) ((sum getMetadataByType(type).balance[?($ > 0)]) default 0)
%function sumNegativeBalance(type) ((sum getMetadataByType(type).balance[?($ < 0)]) default 0)
%function sumAllBalance(type) ((sum getMetadataByType(type).balance) default 0)
%function sumTotal(type) ((sum getMetadataByType(type).total) default 0)
%var valueOfX = sumAllBalance("AAA") - sumTotal("BBB")
%var valueOfY = sumPositiveBalance("AAA")
%var valueOfZ = sumTotal("BBB") + (sumNegativeBalance("AAA") * -1)
---
{
X: valueOfX,
Y: valueOfY,
Z: valueOfZ
}