Как отобразить заданное поле c для обновления в базе данных Mulesoft - PullRequest
1 голос
/ 09 марта 2020

Я хочу получить поле Speci c для обновления с помощью сообщения dataweave / transform, сравнивая два объекта JSON. В настоящее время я получаю целые поля в объекте.

КОД:

%dw 1.0
%output application/json
%var old = {
   "b":{
       "c":"dog",
       "d":"egg"
    }
}
%var new = {
   "b":{
       "c":"dog",
       "d":"eagle"
    }
 }
%function updateValue(newValue, newKey)
    null when old."$newKey" == newValue and old."$newKey" != null otherwise {
        newValuealue: newValue default null,
        oldValue: old."$newKey" default null
    }
%function compare(v)
    v match {
        :object -> $ mapObject ((v,k) -> {
            (k): updateValue(v,k)
        }),
        default -> updateValue(v)
    }
---
compare(new)

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:

"b":[{
   "oldValue":{
      "d":"egg"
   },
   "newValue":{
      "d":"eagle"
  }]
}

Текущая сборка: (Я не хочу включить "c": "собака", поскольку она не обновлена)

"b":[{
   "oldValue":{
      "c":"dog",
      "d":"egg"
   },
   "newValue":{
      "c":"dog"
      "d":"eagle"
  }]
}

1 Ответ

2 голосов
/ 09 марта 2020

Для вашего конкретного примера c я могу сделать, как показано ниже:

%dw 1.0
%output application/json
%var old = {
   "b":{
       "c":"dog",
       "d":"egg"
    }
}
%var new = {
   "b":{
       "c":"dog",
       "d":"eagle"
    }
 }
%var both = old.b ++ new.b
---
b: [
    {oldvalue: both -- new.b},
    {newvalue: both -- old.b}
]

Всегда ли имя поля b всегда одинаково? Ожидаете ли вы иметь несколько полей, которые вы хотите проверить на разницу? Если да, предоставьте мне полный пример (насколько это возможно), и я посмотрю, как его трансформировать.

Тем не менее, начало решения (рекурсивное или нет) - это то, что я сделал выше.

...