Mule 有没有办法用Dataweave映射创建更灵活的循环?

Mule 有没有办法用Dataweave映射创建更灵活的循环?,mule,dataweave,Mule,Dataweave,我有一个问题,在任何其他语言中都需要10秒钟,但在这里,我无法用Dataweave解决它 我有这样的JSON: { "100": [{ "courseID": "100", "course": "physics", "instructor": "John S", "section": "A", "date": "01-01-1900" }], "200": [{ "course

我有一个问题,在任何其他语言中都需要10秒钟,但在这里,我无法用Dataweave解决它

我有这样的JSON:

{
    "100": [{
        "courseID": "100",
        "course": "physics",
        "instructor": "John S",
        "section": "A",
        "date": "01-01-1900"
    }],
    "200": [{
        "courseID": "200",
        "course": "math",
        "instructor": "Jim R",
        "section": "A",
        "date": "01-03-1900"
    },
    {
        "courseID": "200",
        "course": "math",
        "instructor": "Jim R",
        "section": "B",
        "date": "01-07-1900"
    },
    {
        "courseID": "200",
        "course": "math",
        "instructor": "Jim R",
        "section": "C",
        "date": "01-08-1900"
    }

    ]}
}
我确信数组中的对象包含重复的信息,除了节和日期。所以我需要将其压缩并转化为:

{
    "courses": [{
        "courseID": "100",
        "course": "physics",
        "instructor": "John S",
        "sections": [{
            "section": "A",
            "date": "01-01-1900"
        }]
    },
    {
        "courseID": "200",
        "course": "math",
        "instructor": "Jim R",
        "sections": [{
            "section": "A",
            "date": "01-03-1900"
        },
        {
            "section": "B",
            "date": "01-07-1900"
        },
        {
            "section": "C",
            "date": "01-08-1900"
        }]
]}
我不能让这事发生。我已经尝试了所有我能看到的方法,使用map()、mapObject()和Pulk()对文档进行迭代。我认为它们需要嵌套,我只想从它迭代的第一个课程中提取ID、课程和讲师,然后继续用部分数据构建对象。嵌套似乎会导致问题,因为存在对象和数组的混合,如果嵌套函数返回错误的类型,map()和mapObject()会抱怨。这是我一直在尝试但没有成功的事情:

%dw 2.0
output application/json
---
"courses": payload.pluck(courseValue, courseKey, courseIndex) -> 
               courseValue map (classValue, classKey, classIndex) ->
                   { courseID: classValue.courseID,
                     instructor: classValue.instructor
                     etc...
 }

我希望一切都清楚了。我很累了,因为我把它弄得太久了。我想做的事情是否太复杂,DW无法处理,我应该使用另一种方法?

此解决方案应该适用于所有DataWeave版本

courses: (payload pluck $$) map using (c = payload[$]) {
  courseID : $,
  course: c[0].course,
  instructor: c[0].instructor,
  sections: c map {
    section: $.section,
    date: $.date
  }
}
该解决方案在Mule 3.x中有效,但在4.x中无效,这在本博客文章“从对象到数组的自动强制”中有解释:


我看到您正在使用DataWeave 2.0。下面是您可以使用的简单DataWeave transformer

变压器:

        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
    courses: (payload pluck $$) map ((courseValue, courseKey) -> {
        courseID: payload[courseValue][0].courseID,
        course: payload[courseValue][0].course,
        instructor: payload[courseValue][0].instructor,
        sections: payload[courseValue] map ((sectionValue, sectionKey) -> {
            section: sectionValue.section,
            date: sectionValue.date
        }) 
    })  
}
]]></ee:set-payload>
            </ee:message>
        </ee:transform>
{
  "100": [
    {
      "courseID": "100",
      "course": "physics",
      "instructor": "John S",
      "section": "A",
      "date": "01-01-1900"
    }
  ],
  "200": [
    {
      "courseID": "200",
      "course": "math",
      "instructor": "Jim R",
      "section": "A",
      "date": "01-03-1900"
    },
    {
      "courseID": "200",
      "course": "math",
      "instructor": "Jim R",
      "section": "B",
      "date": "01-07-1900"
    },
    {
      "courseID": "200",
      "course": "math",
      "instructor": "Jim R",
      "section": "C",
      "date": "01-08-1900"
    }
  ]
}
{
  "courses": [
    {
      "courseID": "100",
      "course": "physics",
      "instructor": "John S",
      "sections": [
        {
          "section": "A",
          "date": "01-01-1900"
        }
      ]
    },
    {
      "courseID": "200",
      "course": "math",
      "instructor": "Jim R",
      "sections": [
        {
          "section": "A",
          "date": "01-03-1900"
        },
        {
          "section": "B",
          "date": "01-07-1900"
        },
        {
          "section": "C",
          "date": "01-08-1900"
        }
      ]
    }
  ]
}
输出:

        <ee:transform doc:name="Transform Message" >
            <ee:message >
                <ee:set-payload ><![CDATA[%dw 2.0
output application/json
---
{
    courses: (payload pluck $$) map ((courseValue, courseKey) -> {
        courseID: payload[courseValue][0].courseID,
        course: payload[courseValue][0].course,
        instructor: payload[courseValue][0].instructor,
        sections: payload[courseValue] map ((sectionValue, sectionKey) -> {
            section: sectionValue.section,
            date: sectionValue.date
        }) 
    })  
}
]]></ee:set-payload>
            </ee:message>
        </ee:transform>
{
  "100": [
    {
      "courseID": "100",
      "course": "physics",
      "instructor": "John S",
      "section": "A",
      "date": "01-01-1900"
    }
  ],
  "200": [
    {
      "courseID": "200",
      "course": "math",
      "instructor": "Jim R",
      "section": "A",
      "date": "01-03-1900"
    },
    {
      "courseID": "200",
      "course": "math",
      "instructor": "Jim R",
      "section": "B",
      "date": "01-07-1900"
    },
    {
      "courseID": "200",
      "course": "math",
      "instructor": "Jim R",
      "section": "C",
      "date": "01-08-1900"
    }
  ]
}
{
  "courses": [
    {
      "courseID": "100",
      "course": "physics",
      "instructor": "John S",
      "sections": [
        {
          "section": "A",
          "date": "01-01-1900"
        }
      ]
    },
    {
      "courseID": "200",
      "course": "math",
      "instructor": "Jim R",
      "sections": [
        {
          "section": "A",
          "date": "01-03-1900"
        },
        {
          "section": "B",
          "date": "01-07-1900"
        },
        {
          "section": "C",
          "date": "01-08-1900"
        }
      ]
    }
  ]
}

非常感谢你的帮助。不幸的是,这对我不起作用。我收到以下错误:消息:“您使用以下参数调用函数‘map’:1:Object({“100”):[{courseID:“100”,course:“physics”,…)2:function($:Any,$$:Any)->?),但它需要以下类型的参数:1:Array 2:function我尝试将map()更改为mapObject(),这不会给我一个错误,但只输出输入中的最后一个过程。它似乎会在每次迭代中循环并覆盖输出,只导致输出中的最后一个过程。您发布的错误消息表明您正在使用Mule 4.x,因此在对Mule 4.x中的更改进行一些研究之后,我添加了一个解决方案在这一点上,我认为这对你是有效的,所以这类方法很有效,但它只会输出列表中的最后一个课程。有点像循环在每次迭代中覆盖自己的输出。