Reputation: 1178
I need to to iterate database query result in dataweave and skip duplicates as well as few elements based on some condition. Say, if vales for a column order is coming like: 10-ord, 11-ord, 12-ord, I should be picking up only 11-ord and skip any other rows which value ends with -ord.
Rest of the values which does not end with -ord should be picked up.
The current code gives distinct element but not the above highlighted condition. The current code is :
payload map ((payload, indexOfPayload) -> {
id: payload.orderId ,
number: payload.orderNumber
}) distinctBy $.number
Upvotes: 0
Views: 9780
Reputation: 92
You can try both contains or the substring login like [3..5] matching ord and filtering the JSON objects.
Upvotes: 0
Reputation: 1
%dw 1.0
%var payload = [
{
"id":"value",
"orderNumber": "10-ord"
},
{
"id":"value",
"orderNumber": "11-ord"
},
{
"id":"value",
"orderNumber": "11-ord"
},
{
"id":"value",
"orderNumber": "12-ord"
},
{
"id":"value",
"orderNumber": "13-ord"
},
{
"id":"value",
"orderNumber": "26"
},
{
"id":"value",
"orderNumber": "26"
}
]
%output application/json
---
payload filter (not ($.orderNumber contains '-ord')) or $.orderNumber=='11-ord' map ((payload, indexOfPayload) -> {
id: payload.id ,
number: payload.orderNumber
}) distinctBy payload.orderNumber
Upvotes: 0
Reputation: 324
Using filter, distinctBy and or clause you can achieve it
%dw 1.0
%var payload = [
{
"id":"value",
"orderNumber": "10-ord"
},
{
"id":"value",
"orderNumber": "11-ord"
},
{
"id":"value",
"orderNumber": "11-ord"
},
{
"id":"value",
"orderNumber": "12-ord"
},
{
"id":"value",
"orderNumber": "13-ord"
},
{
"id":"value",
"orderNumber": "14"
},
{
"id":"value",
"orderNumber": "14"
}
]
%output application/json
---
payload filter (not($.orderNumber contains '-ord')) or $.orderNumber =='11-ord' map ((payload, indexOfPayload) -> {
id: payload.id ,
number: payload.orderNumber
}) distinctBy payload.orderNumber
Output
[
{
"id": "value",
"number": "11-ord"
},
{
"id": "value",
"number": "14"
}
]
Duplicate values and values with -ord are removed except one
Upvotes: 1
Reputation: 2415
You should use filter before mapping for better performance. Try following filter for your requirement
payload filter ($.orderNumber contains '-ord') and $.orderNumber == '11-ord' map ((payload, indexOfPayload) -> {
id: payload.orderId ,
number: payload.orderNumber
})
HTH
Upvotes: 0
Reputation: 341
You could achieve it based on the "filter" clause. I built a sample logic demonstrating your case below:
%dw 1.0
%var payload = [
{
"id":"value",
"orderNumber": "10-ord"
},
{
"id":"value",
"orderNumber": "11"
},
{
"id":"value",
"orderNumber": "12-ord"
},
{
"id":"value",
"orderNumber": "13-ord"
},
{
"id":"value",
"orderNumber": "14-ord"
}
]
%output application/json
---
payload filter (not ($.orderNumber contains '-ord') )
Upvotes: 0