使用dataweave 2.0根据多个条件,用另一个数组中的数据丰富一个JSON数组

问题描述

最近,我问了this问题,该问题基于多个条件过滤并合并两个JSON。

但是,现在我需要mongo变量来充实MysqL变量数据。如果有条件

mongo.NUM_CONTROL = MysqL.DOCNUM
mongo.NUM_ITEM = MysqL.LIN_NUM_ITEM

不匹配,每个mongo元素保持不变。但是,如果它们匹配,则每个mongo元素都必须包含MysqL个等效项。

解决方法

您可以使用以下数据编织表达式:

%dw 2.0
import * from dw::core::Arrays
output application/json
---
leftJoin(mongo,mysql,(m) -> m.NUM_CONTROL ++ "_" ++ m.NUM_ITEM,(s) -> s.DOCNUM ++ "_" ++ s.LIN_NUM_ITEM) map (item,index) -> 
  item.l ++ (if (item.r != null) item.r else {})

为了左连接两个数组,需要一个公共键字段。在这种情况下,根据您的情况,公用密钥对应于:

  • mongo:NUM_CONTROL和NUM_ITEM
  • mysql:DOCNUM和LIN_NUM_ITEM

因此,将mongo.NUM_CONTROL与mysql.NUM_ITEM串联将为mongo提供唯一的记录密钥,而将mysql.DOCNUM和mysql.LIN_NUM_ITEM串联将为mysql提供唯一的记录密钥。现在,这些计算出的键可用于左连接数组。使用下划线字符(或任何其他非数字字符,例如管道)作为分隔符,将确保匹配正确的记录(如果您有NUM_CONTROL = 1和NUM_ITEM = 11的mongo记录以及mysql记录DOCNUM = 11且LIN_NUM_ITEM = 1时,如果没有分隔符,则mongo和mysql的计算键值将相同(111),并且它们的连接将不正确。使用分隔符,将不会发生,因为mongo计算的键为1_11和mysql计算出的密钥11_1)。