Фильтрация массива Dataweave 2.0 на основе значений других массивов - PullRequest
1 голос
/ 25 февраля 2020

Я пытаюсь сопоставить / отфильтровать следующие значения lineId в массиве unmatchedIds, чтобы затем отфильтровать результирующий набор exampleFile по processorTransactionId. Результатом будет удаление последнего объекта financialTransactionEntity с processorTransactionId = "000000062121029333".

Теоретически размеры как массива unmatchedIds, так и массива exampleFile могут быть неограниченными.

Любые рекомендации / советы / примеры будут высоко оценены. Мне трудно использовать фильтр данных для достижения этой цели.

{
  "unmatchedIds": [
    {
      "lineId": "000000062121029111"
    },
    {
      "lineId": "000000062121029222"
    }
  ]
}

exampleFile

[{
        "financialTransactionEntity": {
            "cardAcceptor": {
                "name": "Burger Inc.",
                "countryCode": "GBP"
            },
            "financialTransaction": {
                "debitOrCredit": "C",
                "amountInOriginalCurrency": {
                    "amount": "0000001000",
                    "exponent": "2"
                },
                "originalCurrencyCode": "826",
                "transactionDate": "2020-02-18"
            },
            "processorTransactionId": "000000062121029111"
        }
    },
    {
        "financialTransactionEntity": {
            "cardAcceptor": {
                "name": "McDonalds Inc.",
                "countryCode": "GBP"
            },
            "financialTransaction": {
                "debitOrCredit": "C",
                "amountInOriginalCurrency": {
                    "amount": "0000002000",
                    "exponent": "2"
                },
                "originalCurrencyCode": "826",
                "transactionDate": "2020-02-18"
            },
            "processorTransactionId": "000000062121029222"
        }
    },
    {
        "financialTransactionEntity": {
            "cardAcceptor": {
                "name": "McDonalds Inc.",
                "countryCode": "GBP"
            },
            "financialTransaction": {
                "debitOrCredit": "C",
                "amountInOriginalCurrency": {
                    "amount": "0000002000",
                    "exponent": "2"
                },
                "originalCurrencyCode": "826",
                "transactionDate": "2020-02-18"
            },
            "processorTransactionId": "000000062121029333"
        }
    }

]

Ответы [ 4 ]

2 голосов
/ 25 февраля 2020

Вы можете использовать селектор данных с фильтром. См. Ниже

%dw 2.0
output application/java

import * from dw::core::Arrays

var unMatchedIds = {
  "unmatchedIds": [
    {
      "lineId": "000000062121029111"
    },
    {
      "lineId": "000000062121029222"
    }
  ]
}

var payload = [{
        "financialTransactionEntity": {
            "cardAcceptor": {
                "name": "Burger Inc.",
                "countryCode": "GBP"
            },
            "financialTransaction": {
                "debitOrCredit": "C",
                "amountInOriginalCurrency": {
                    "amount": "0000001000",
                    "exponent": "2"
                },
                "originalCurrencyCode": "826",
                "transactionDate": "2020-02-18"
            },
            "processorTransactionId": "000000062121029111"
        }
    },
    {
        "financialTransactionEntity": {
            "cardAcceptor": {
                "name": "McDonalds Inc.",
                "countryCode": "GBP"
            },
            "financialTransaction": {
                "debitOrCredit": "C",
                "amountInOriginalCurrency": {
                    "amount": "0000002000",
                    "exponent": "2"
                },
                "originalCurrencyCode": "826",
                "transactionDate": "2020-02-18"
            },
            "processorTransactionId": "000000062121029222"
        }
    },
    {
        "financialTransactionEntity": {
            "cardAcceptor": {
                "name": "McDonalds Inc.",
                "countryCode": "GBP"
            },
            "financialTransaction": {
                "debitOrCredit": "C",
                "amountInOriginalCurrency": {
                    "amount": "0000002000",
                    "exponent": "2"
                },
                "originalCurrencyCode": "826",
                "transactionDate": "2020-02-18"
            },
            "processorTransactionId": "000000062121029333"
        }
    }

]

---

using (unMatchedArray = unMatchedIds.unmatchedIds.*lineId)
payload[?(unMatchedArray contains $.financialTransactionEntity.processorTransactionId)]

unMatchedArray - это просто список несопоставленных идентификаторов, исходящих из вашего исходного объекта (unMatchedIds). Селектор данных просто включит запись, если financialTransactionEntity.processorTransactionId находится в unMatchedArray.

1 голос
/ 25 февраля 2020

Вы можете использовать функции groupBy и filter для достижения результата. Сначала вы можете сгруппировать unMatchIds по lineId, а затем применить фильтр к фактической полезной нагрузке, чтобы исключить все несопоставимые элементы.

output application/json
var unMatchIdsGrouped = var.unMatchIds.unmatchedIds groupBy $.lineId
---
payload filter ((item) -> unMatchIdsGrouped[ item.financialTransactionEntity.processorTransactionId] !=null)
0 голосов
/ 21 марта 2020

Вот еще один ответ .... Надеюсь, это поможет

    %dw 2.2
output application/json
var inpUnmatchedIds = {
  "unmatchedIds": [
    {
      "lineId": "000000062121029111"
    },
    {
      "lineId": "000000062121029222"
    }
  ]
}
var exampleIds = [{
        "financialTransactionEntity": {
            "cardAcceptor": {
                "name": "Burger Inc.",
                "countryCode": "GBP"
            },
            "financialTransaction": {
                "debitOrCredit": "C",
                "amountInOriginalCurrency": {
                    "amount": "0000001000",
                    "exponent": "2"
                },
                "originalCurrencyCode": "826",
                "transactionDate": "2020-02-18"
            },
            "processorTransactionId": "000000062121029111"
        }
    },
    {
        "financialTransactionEntity": {
            "cardAcceptor": {
                "name": "McDonalds Inc.",
                "countryCode": "GBP"
            },
            "financialTransaction": {
                "debitOrCredit": "C",
                "amountInOriginalCurrency": {
                    "amount": "0000002000",
                    "exponent": "2"
                },
                "originalCurrencyCode": "826",
                "transactionDate": "2020-02-18"
            },
            "processorTransactionId": "000000062121029222"
        }
    },
    {
        "financialTransactionEntity": {
            "cardAcceptor": {
                "name": "McDonalds Inc.",
                "countryCode": "GBP"
            },
            "financialTransaction": {
                "debitOrCredit": "C",
                "amountInOriginalCurrency": {
                    "amount": "0000002000",
                    "exponent": "2"
                },
                "originalCurrencyCode": "826",
                "transactionDate": "2020-02-18"
            },
            "processorTransactionId": "000000062121029333"
        }
    }
]
---
exampleIds filter (value) -> ((((inpUnmatchedIds pluck $.lineId))[0]) contains (value.financialTransactionEntity.processorTransactionId))
0 голосов
/ 28 февраля 2020

Я бы предложил преобразовать объект unmatchedIds в массив id, а затем отфильтровать exampleFile объекты на основе того, найден ли processorTransactionId в сравниваемом массиве с использованием полного сценария contains:

%dw 2.0
output application/java


var unMatchedIds = {
  "unmatchedIds": [
    {
      "lineId": "000000062121029111"
    },
    {
      "lineId": "000000062121029222"
    }
  ]
}

var exampleFile = [{
        "financialTransactionEntity": {
            "cardAcceptor": {
                "name": "Burger Inc.",
                "countryCode": "GBP"
            },
            "financialTransaction": {
                "debitOrCredit": "C",
                "amountInOriginalCurrency": {
                    "amount": "0000001000",
                    "exponent": "2"
                },
                "originalCurrencyCode": "826",
                "transactionDate": "2020-02-18"
            },
            "processorTransactionId": "000000062121029111"
        }
    },
    {
        "financialTransactionEntity": {
            "cardAcceptor": {
                "name": "McDonalds Inc.",
                "countryCode": "GBP"
            },
            "financialTransaction": {
                "debitOrCredit": "C",
                "amountInOriginalCurrency": {
                    "amount": "0000002000",
                    "exponent": "2"
                },
                "originalCurrencyCode": "826",
                "transactionDate": "2020-02-18"
            },
            "processorTransactionId": "000000062121029222"
        }
    },
    {
        "financialTransactionEntity": {
            "cardAcceptor": {
                "name": "McDonalds Inc.",
                "countryCode": "GBP"
            },
            "financialTransaction": {
                "debitOrCredit": "C",
                "amountInOriginalCurrency": {
                    "amount": "0000002000",
                    "exponent": "2"
                },
                "originalCurrencyCode": "826",
                "transactionDate": "2020-02-18"
            },
            "processorTransactionId": "000000062121029333"
        }
    }

]

---
exampleFile filter (unMatchedIds.unmatchedIds.lineId contains $.financialTransactionEntity.processorTransactionId)
...