使用DataWeave聚合/求和值

时间:2016-03-01 11:53:33

标签: mule dataweave

我在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格式显示。

任何指导都将不胜感激。

2 个答案:

答案 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
}