【问题标题】:Dataweave 2.0 array filtering based on another arrays values基于另一个数组值的 Dataweave 2.0 数组过滤
【发布时间】:2020-03-21 14:35:09
【问题描述】:

我正在尝试匹配/过滤 unmatchedIds 数组中的以下 lineId 值,然后通过 processorTransactionId 过滤 exampleFile 的结果集。结果将是删除最后一个金融事务实体,处理器事务 ID =“000000062121029333”。

理论上,unmatchedIds 数组和 exampleFile 数组的大小都可以是无限的。

任何指导/建议/示例将不胜感激。目前我很难使用 dataweave 过滤器来实现这一点。

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

示例文件

[{
        "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"
        }
    }

]

【问题讨论】:

    标签: arrays filter dataweave mulesoft


    【解决方案1】:

    您可以使用带有过滤器的数据选择器。见下文

    %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)的不匹配ID 的列表。如果 FinancialTransactionEntity.processorTransactionId 在 unMatchedArray 中,数据选择器将只包含条目。

    【讨论】:

    • 为什么要使用“使用”?您可以将其定义为变量,甚至将其内联到过滤器中吗?
    • 对于这种情况,除了明确它所代表的内容外,没有其他理由。正如您所提到的,您可以将其声明为 var 或在过滤器中内联定义它。在相关说明中,我只是习惯于使用“使用”,特别是对于嵌套的有效负载。
    【解决方案2】:

    您可以使用groupByfilter 函数来实现结果。首先,您可以将 unMatchIdslineId 分组,然后您可以对实际有效负载应用过滤器以消除所有不匹配的项目。

    output application/json
    var unMatchIdsGrouped = var.unMatchIds.unmatchedIds groupBy $.lineId
    ---
    payload filter ((item) -> unMatchIdsGrouped[ item.financialTransactionEntity.processorTransactionId] !=null)
    

    【讨论】:

      【解决方案3】:

      我建议将unmatchedIds 对象转换为id 的数组,然后使用contains 完整脚本根据是否在比较数组中找到processorTransactionId 过滤exampleFile 对象:

      %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)
      

      【讨论】:

        【解决方案4】:

        这是另一个答案....希望对您有所帮助

            %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))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-28
          • 1970-01-01
          • 2019-10-03
          • 2021-01-05
          • 1970-01-01
          • 2018-04-04
          相关资源
          最近更新 更多