基于项目匹配 Dataweave 2.0 计算 Json 中的元素数

Counting Number of elements in Json based on Item match Dataweave 2.0

我有如下输入,响应需要 orderBy ClientNo 并根据相同 ClientNo.

的重复次数添加 SeqNo

例如 ClientNo:7011 重复 2 次,它应该添加 seqNo: 1 和下一个对象为 2,类似 ClientNo:7022 等..

如果问题不清楚,请告诉我。提前感谢您的帮助。

%dw 2.0
 ---
payload  orderBy $.ClientNo map (payload01,index) -> {

ClientNo: payload01.ClientNo,
Quantity:payload01.Quantity,
SeqNo: ????( Required to calculate repeats of seqNo based on $.ClientNo match dynamically )
Volume:payload01.Volume,
TrackDetails:payload01.TrackDetails

}

输入:

 [
     {
      "ClientNo":7011,
      "Quantity":80,
      "Volume":10,
      "TrackDetails":"Test"
     },
    {
      "ClientNo":7011,
      "Quantity":60,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7022,
      "Quantity":10,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7023,
      "Quantity":100,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7022,
      "Quantity":20,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7022,
      "Quantity":70,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7023,
      "Quantity":100,
      "Volume":10,
      "TrackDetails":"Test"
   }
]

输出:

 [
   {
      "ClientNo":7011,
      "Quantity":80,
      "SeqNo":1,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7011,
      "Quantity":60,
      "SeqNo":2,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7022,
      "Quantity":10,
      "SeqNo":1,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7022,
      "Quantity":20,
      "SeqNo":2,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7022,
      "Quantity":70,
      "SeqNo":3,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7023,
      "Quantity":100,
      "SeqNo":1,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7023,
      "Quantity":100,
      "SeqNo":2,
      "Volume":10,
      "TrackDetails":"Test"
   }
]

试试这个,有一个警告要让它工作,你必须使用 4.3.0 Mule 运行时,它可以用以前的版本来完成——让我知道,我会尽可能地做:

%dw 2.0
output application/dw
var data = [
     {
      "ClientNo":7011,
      "Quantity":80,
      "Volume":10,
      "TrackDetails":"Test"
     },
    {
      "ClientNo":7011,
      "Quantity":60,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7022,
      "Quantity":10,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7023,
      "Quantity":100,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7022,
      "Quantity":20,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7022,
      "Quantity":70,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7023,
      "Quantity":100,
      "Volume":10,
      "TrackDetails":"Test"
   }
]
---
(do {
    var counters = data.*ClientNo reduce (e,acc={}) -> acc ++ {(e): 0}
    ---
    data reduce (
        (rec, result = {c: counters,r : []}) -> do {
            var updatedCounters = result.c update {
                case f at ."$(rec.ClientNo)" -> f + 1
            }
            ---
            {
                c: updatedCounters,
                r: result.r + {(rec), SeqNo: updatedCounters[rec.ClientNo as Key]}
            }
        }
    )
}).r

解决方案的关键是跟踪一组计数器,reduce 也感觉很自然。

编辑:4.3.0 之前的 mule 运行时解决方案

%dw 2.0
output application/dw
var data = [
     {
      "ClientNo":7011,
      "Quantity":80,
      "Volume":10,
      "TrackDetails":"Test"
     },
    {
      "ClientNo":7011,
      "Quantity":60,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7022,
      "Quantity":10,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7023,
      "Quantity":100,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7022,
      "Quantity":20,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7022,
      "Quantity":70,
      "Volume":10,
      "TrackDetails":"Test"
   },
   {
      "ClientNo":7023,
      "Quantity":100,
      "Volume":10,
      "TrackDetails":"Test"
   }
]
---
(do {
    var counters = data.*ClientNo reduce (e,acc={}) -> acc ++ {(e): 0}
    ---
    data reduce (
        (rec, result = {c: counters,r : []}) -> do {
            var k = rec.ClientNo as Key
            var updatedCounters = {
                (result.c - k), 
                (k): result.c[k] + 1
            }
            ---
            {
                c: updatedCounters,
                r: result.r + {(rec), SeqNo: updatedCounters[k]}
            }
        }
    )
}).r
orderBy $.SeqNo
orderBy $.ClientNo