как использовать функцию groupBy с использованием Dataweve в Mulesoft

#dataweave #mulesoft

#dataweave #mulesoft

Вопрос:

У меня есть данные JSON в Dataweave. Я бы хотел сгруппировать продукты.plu затем суммирует количество.

пожалуйста, смотрите Ниже ввод и желаемый результат. Спасибо

 {
  "brandCode": "XXX",
  "storeCode": "XX100",
  "products": [
 {
    "plu": "NF0A529SWE7100L",
    "qty": 2.000
  },
  {
    "plu": "NF0A529SWE7100L",
    "qty": -1.000
  },
  {
    "plu": "NF0A529SWE7100M",
    "qty": 2.000
  }
]
  }
 

Желаемый результат:

 {
  "brandCode": "XXX",
  "storeCode": "XX100",
  "products": [
 {
    "plu": "NF0A529SWE7100L",
    "qty": 1.000
  },
  {
    "plu": "NF0A529SWE7100M",
    "qty": 2.000
  }]
  }
 

Комментарии:

1. извините, я не видел вашего комментария. не могли бы вы опубликовать еще раз

2. Я не оставил ничего, хотя просто примечание, чтобы убедиться, что вы проверяете объект ввода и вывода в редакторе json или xml, прежде чем публиковать их здесь. Также, если вы предоставляете свой фрагмент кода (предоставьте полный фрагмент), используйте блок кода, чтобы сделать его читаемым .

Ответ №1:

мой код приведен ниже

 {
      "brandCode": payload.brandCode,
      "storeCode": payload.storeCode,
      "products": 
       payload.products groupBy $.plu distinctBy $ pluck $ map{
        "plu": $.storeCode,
        "qty": (sum($.qty)),
 

но вывод:plu — это массив (например: «plu»: [«NF0A529SWE7100L»])
я должен использовать min ($.plu),
могу ли я узнать, есть ли у нас лучший метод?

Ответ №2:

Одним из подходов может быть (использование вашего кода)

Ввод:

 {
  "brandCode": "XXX",
  "storeCode": "XX100",
  "products": [
  {
    "plu": "NF0A529SWE7100L",
    "qty": 2.000
  },
  {
    "plu": "NF0A529SWE7100L",
    "qty": -1.000
  },
  {
    "plu": "NF0A529SWE7100M",
    "qty": 2.000
  }
]
}
 

Скрипт:

 %dw 2.0
output application/json
---
{
      "brandCode": payload.brandCode,
      "storeCode": payload.storeCode,
      "products":  payload.products groupBy $.plu pluck $ map {
           plu: $[0].plu,
           qty:sum($.qty)
      }
}
 

Вывод:

 {
  "brandCode": "XXX",
  "storeCode": "XX100",
  "products": [
    {
      "plu": "NF0A529SWE7100L",
      "qty": 1.000
    },
    {
      "plu": "NF0A529SWE7100M",
      "qty": 2.000
    }
  ]
}
 

Комментарии:

1. Можно было бы просто использовать plu: $$ внутри pluck, поскольку это ссылка на ключ

Ответ №3:

на Mule 4.3.x DW 2.3.x

 %dw 2.0
output application/json
fun sumProducts(data: Object): Object = (
    data update {
        case .products -> 
            data.products groupBy $.plu pluck (value, key, index) -> 
                {
                    plu: key,
                    qty: sum(value.qty default [])
                }
    }
)
---
sumProducts(payload)