首页 > 解决方案 > Mule 4 /DW 2.0 如何根据“标题”插入此 JSON?

问题描述

我有一个 JSON 如下:

[{
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 122},
        "Title": "ABC",
        "Auto Reversing": "",
        "Debit": 20,
        "Credit": 0
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 122},
        "Title": "ABC",
        "Auto Reversing": "",
        "Debit": 10,
        "Credit": 0
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 122},
        "Title": "ABC",
        "Auto Reversing": "",
        "Debit": 0,
        "Credit": 30
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 3144},
        "Title": "DEF",
        "Auto Reversing": "",
        "Debit": 10,
        "Credit": 0
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 3144},
        "Title": "DEF",
        "Auto Reversing": "",
        "Debit": 0,
        "Credit": 10
    }
]

ABC我必须将此数据上传到 netsuite,因此,应该只根据“标题”字段(和DEF此处)中的不同标题在 netsuite 中创建记录。

同一标题的每个条目都应不断更新记录,例如,对于 title 的每个条目,ABCnetsuite 中应该只有 1 条记录,所有值都已更新。

我尝试过使用groupby,但是,动态更新 groupby 对象给我带来了问题。这是groupby之后的输出。

{
  "DEF": [
    {
      "Number": "66667",
      "Date": "2020-08-29 16:40:32.0",
      "Account Number": {
        "externalId": 1,
        "account": 3144
      },
      "Title": "DEF",
      "Auto Reversing": "",
      "Debit": 0,
      "Credit": 10
    },
    {
      "Number": "66667",
      "Date": "2020-08-29 16:40:32.0",
      "Account Number": {
        "externalId": 1,
        "account": 3144
      },
      "Title": "DEF",
      "Debit": 0,
      "Credit": 10
    }
  ],
  "ABC": [
    {
      "Number": "66667",
      "Date": "2020-08-29 16:40:32.0",
      "Account Number": {
        "externalId": 1,
        "account": 3144
      },
      "Title": "ABC",
      "Debit": 20,
      "Credit": 0
    },
    {
      "JE Number": "66667",
      "JE Date": "2020-08-29 16:40:32.0",
      "Account Number": {
        "externalId": 1,
        "account": 3144
      },
      "Journal Entry Title": "ABC",
      "Debit": 10,
      "Credit": 0
    },
    {
      "JE Number": "66667",
      "JE Date": "2020-08-29 16:40:32.0",
      "Account Number": {
        "externalId": 1,
        "account": 3144
      },
      "Journal Entry Title": "ABC",
      "Debit": 0,
      "Credit": 30
    }
  ]
}

我不知道如何进一步进行此操作。

标签: muleanypoint-studiodataweavemulesoft

解决方案


首先让我说你的问题不清楚。我将在下面回答我的答案:“总共应该只生成 2 条记录,一条带有标题 ABC,另一条带有 DEF。”

我确实使用了dw::core::Objects::mergeWith函数,你可以在这里找到文档:https ://docs.mulesoft.com/mule-runtime/4.2/dw-objects-functions-mergewith

尝试这个:payload distinctBy $.Title

编辑:既然你进一步澄清了这个问题,我可以告诉你我不知道如何使用 netsuite 连接器,但我知道 DW,我可以用相同的方式逐步更新对象,Title从而给我更新的结果。

试试这个代码:

%dw 2.0
output application/dw
var data = [{
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 122},
        "Title": "ABC",
        "Auto Reversing": "",
        "Debit": 20,
        "Credit": 0
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 122},
        "Title": "ABC",
        "Auto Reversing": "",
        "Debit": 10,
        "Credit": 0
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 122},
        "Title": "ABC",
        "Auto Reversing": "",
        "Debit": 0,
        "Credit": 30
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 3144},
        "Title": "DEF",
        "Auto Reversing": "",
        "Debit": 10,
        "Credit": 0
    },
    {
        "Number": "66667",
        "Date": "2020-08-29 16:40:32.0",
        "Account Number":  {"externalId":1,"account": 3144},
        "Title": "DEF",
        "Auto Reversing": "",
        "Debit": 0,
        "Credit": 10
    }
]
---
// Group the data by Title
data groupBy $.Title
// Iterate over the object
mapObject {
    ($$): (
        // Iterate over the array in the values and mergeWith the sequence 
        // of objects with the same title
        // NOTE: the values to the right take precedence when using mergeWith.
        $ reduce (e, acc={}) -> acc dw::core::Objects::mergeWith e
    )
}
// Restore the array with the updated objects
pluck $

推荐阅读