Contact Free trial Login

Merge Fields from Separate Objects

The DataWeave examples merge fields from separate input arrays. The first (firstInput) is a DataWeave variable that lists price by book ID, and the second (secondInput) lists authors by book ID. Each book has a unique bookId key. Before you begin, note that DataWeave 2.0 (%dw 2.0) is for Mule 4 apps. For a Mule 3 app, refer to DataWeave 1.0 (%dw 1.0) examples, within the Mule 3.9 documentation set. For other Mule versions, you can use the Mule Runtime version selector in the table of contents.

The DataWeave scripts produce the same output. Both scripts use two map functions with a filter, and one of them also creates an alias for the bookId:

  • The first map function iterates over the elements of the firstInput array. As the function evaluates each element, a second map function uses a filter to identify any elements in the second array (secondInput) that match the filter criteria (secondInput filter ($.*bookId contains firstInputValue.bookId)). The filter returns an element from secondInput that contains a bookId value that matches the bookId value in the firstInput element.

  • The second map function evaluates that filtered element and then uses secondInputValue.author to select and populate the value of its "author" field in the object {author : secondInputValue.author}.

  • filter limits the scope of the second map function to objects in the secondInput that share the same bookId.

DataWeave Script:
%dw 2.0
var firstInput = [
  { "bookId":"101",
    "title":"world history",
    "price":"19.99"
  },
  {
    "bookId":"202",
    "title":"the great outdoors",
    "price":"15.99"
  }
]
var secondInput = [
  {
    "bookId":"101",
    "author":"john doe"
  },
  {
    "bookId":"202",
    "author":"jane doe"
  }
]
output application/json
---
firstInput map (firstInputValue) ->
  {
    theId : firstInputValue.bookId as Number,
    theTitle: firstInputValue.title,
    thePrice: firstInputValue.price as Number,
    (secondInput filter ($.*bookId contains firstInputValue.bookId) map (secondInputValue) -> {
      theAuthor : secondInputValue.author
    })
  }

As the next script shows, you can also write the same script using an id alias (created with using (id = firstInputValue.bookId)). The alias replaces the selector expression, firstInputValue.bookId, which is longer.

DataWeave Script with Alias:
%dw 2.0
var firstInput = [
  { "bookId":"101",
    "title":"world history",
    "price":"19.99"
  },
  {
    "bookId":"202",
    "title":"the great outdoors",
    "price":"15.99"
  }
]
var secondInput = [
  {
    "bookId":"101",
    "author":"john doe"
  },
  {
    "bookId":"202",
    "author":"jane doe"
  }
]
output application/json
---
firstInput map (firstInputValue) -> using (id = firstInputValue.bookId)
  {
    theValue : id as Number,
    theTitle: firstInputValue.title,
    thePrice: firstInputValue.price as Number,
    (secondInput filter ($.*bookId contains id)  map (secondInputValue) -> {
      theAuthor : secondInputValue.author
    })
  }

Both scripts produce the same output.

Output
[
  {
    "theId": 101,
    "theTitle": "world history",
    "thePrice": 19.99,
    "theAuthor": "john doe"
  },
  {
    "theId": 202,
    "theTitle": "the great outdoors",
    "thePrice": 15.99,
    "theAuthor": "jane doe"
  }
]

We use cookies to make interactions with our websites and services easy and meaningful, to better understand how they are used and to tailor advertising. You can read more and make your cookie choices here. By continuing to use this site you are giving us your consent to do this.