shu
shu

Reputation: 1

dataweave array transformation to combine data with same key values

I want to combine the list of all projects with the same companyName and companyId.

I need help processing Data such that it will take all data with the same values for companyName and companyId and combine it into its own array.

Input Example Data that I expect will be here:

[{
    "companyName": "ABC company",
    "companyId": "123",
    "projectName": "project1",
    "levelCode": "893",
    "projectStatus": "2"

},
{
    "companyName": "ABC company",
    "companyId": "123",
    "projectName": "project2",
    "levelCode": "1386",
    "userId": "183",
    "projectStatus": "2"

},
{
    "companyName": "ABC company",
    "companyId": "123",
    "projectName": "project3",
    "levelCode": "1655",
    "userId": "183",
    "projectStatus": "1"

},
{
    "companyName": "ABC company",
    "companyId": "123",
    "projectName": "project4",
    "levelCode": "1865",
    "userId": "159",
    "projectStatus": "2"

}]

Expected Output

After Manipulating all the data: Note that all the projects involving companyName "ABC company" are now merged into one array (projects).

[
  {
    "companyName": "ABC company",
    "companyId": "123",
    "projects": {
      "projectName": "project1",
      "levelCode": "893",
      "projectStatus": "2"
    },
    {
      "projectName": "project2",
      "levelCode": "1386",
      "userId": "183",
      "projectStatus": "2"
    },
    {
      "projectName": "project3",
      "levelCode": "1655",
      "userId": "183",
      "projectStatus": "1"
    },
    {
      "projectName": "project4",
      "levelCode": "1865",
      "userId": "159",
      "projectStatus": "2"
    }
  }
]

Upvotes: 0

Views: 2938

Answers (3)

Bharath
Bharath

Reputation: 11

Check this out.

%dw 1.0
%output application/json
---
payload distinctBy $.CompanyName map {
    companyName: $.companyName,
    companyID: $.companyId,
    Projects: payload map {
        projectName: $.projectName,
        levelCode: $.levelCode,
        userId: $.userId,
        projectStatus: $.projectStatus
        }
}

Upvotes: 1

Vikalp
Vikalp

Reputation: 24

This will work:

%dw 1.0
%output application/json
---
payload distinctBy $.companyName map ((result, IndexOfResult) -> {
    companyName: result.companyName,
    companyId: result.companyId,
    project: payload[?($.companyName == result.companyName)] map {
        projectName: $.projectName,
        levelCode: $.levelCode,
        userId: $.userId,
        projectStatus: $.projectStatus
    } 
})

Upvotes: 1

Srinivas
Srinivas

Reputation: 92

You have GroupBy operator with which this can be done easily. Here you need to group by companyName and companyId payload groupBy $.companyName,companyId

Please read the link below for detailed information about groupby operator. https://docs.mulesoft.com/mule-user-guide/v/3.8/dataweave-operators#group-by

Upvotes: 0

Related Questions