Mule 4: Dataweave: как фильтровать и обновлять совпадающий объект в списке?

Сценарий: у меня есть список студентов. Я хочу отфильтровать учащегося, имеющего определенный идентификатор studentId, и обновить его оценки, чтобы в списке было 60. Как я могу сделать это без использования оператора обновления, представленного в Mule 4.3

Список студентов:

[
  {
    "studentId": "781e5dc2-f76b-4e35-ac27-f5835c960083",
    "studentName": "Mr. 1",
    "studentMarks": 1
  },
  {
    "studentId": "cb8a606a-b91c-4697-8d73-84170b156180",
    "studentName": "Mr. 2",
    "studentMarks": 4
  },
  {
    "studentId": "656b247f-a755-476f-a845-b61d28e4be79",
    "studentName": "Mr. 3",
    "studentMarks": 9
  },
  {
    "studentId": "d1cd5ee3-cef6-4d5e-a380-cb5e79495f77",
    "studentName": "Mr. 4",
    "studentMarks": 16
  }
]

Учащийся, чьи оценки должны быть обновлены до 60, имеет studentId: 656b247f-a755-476f-a845-b61d28e4be79

Итак, после обновления конечный результат должен быть:

[
  {
    "studentId": "781e5dc2-f76b-4e35-ac27-f5835c960083",
    "studentName": "Mr. 1",
    "studentMarks": 1
  },
  {
    "studentId": "cb8a606a-b91c-4697-8d73-84170b156180",
    "studentName": "Mr. 2",
    "studentMarks": 4
  },
  **{
    "studentId": "656b247f-a755-476f-a845-b61d28e4be79",
    "studentName": "Mr. 3",
    "studentMarks": 60
  }**,
  {
    "studentId": "d1cd5ee3-cef6-4d5e-a380-cb5e79495f77",
    "studentName": "Mr. 4",
    "studentMarks": 16
  }
]

person Bibek Kr. Bazaz    schedule 12.04.2021    source источник


Ответы (2)


Хотя оператор обновления был добавлен в Mule 4.3, существует update ( ) функция в пакете Values, начиная с Mule 4.2.

Я рекомендую избегать исправления идентификатора, поэтому я инкапсулирую изменение в функции, чтобы параметризовать его:

%dw 2.0
output application/json
import * from dw::util::Values

fun updateStudentMarks(list, id) =
    list map 
        if ($.studentId == id) $ update "studentMarks" with 60 
        else $

---
updateStudentMarks(payload, "656b247f-a755-476f-a845-b61d28e4be79")
person aled    schedule 12.04.2021

Пожалуйста, проверьте этот DW. Оператор обновления не используется. Только условная логика. Если у вас есть какие-либо динамические требования и нет жесткого кодирования, дайте мне знать, я постараюсь обновить свой ответ.

%dw 2.0
output application/json
---
payload map (($ - 'studentMarks') ++
{'studentMarks': 
    if ($."studentId" == "656b247f-a755-476f-a845-b61d28e4be79")
        60
    else
        $.'studentMarks'
})

Выход

[
  {
    "studentId": "781e5dc2-f76b-4e35-ac27-f5835c960083",
    "studentName": "Mr. 1",
    "studentMarks": 1
  },
  {
    "studentId": "cb8a606a-b91c-4697-8d73-84170b156180",
    "studentName": "Mr. 2",
    "studentMarks": 4
  },
  {
    "studentId": "656b247f-a755-476f-a845-b61d28e4be79",
    "studentName": "Mr. 3",
    "studentMarks": 60
  },
  {
    "studentId": "d1cd5ee3-cef6-4d5e-a380-cb5e79495f77",
    "studentName": "Mr. 4",
    "studentMarks": 16
  }
]
person Karthik    schedule 12.04.2021
comment
Спасибо за Ваш ответ. Не могли бы вы объяснить синтаксис и как вы его придумали? - person Bibek Kr. Bazaz; 13.04.2021
comment
@ BibekKr.Bazaz Поскольку ($ - 'studentMarks') находится внутри карты, он удалит все поля studentMarks из исходной полезной нагрузки. Теперь вручную я проверяю, совпадает ли идентификатор с требуемым идентификатором, а затем добавляю (++) studentMarks к 60 к исходной полезной нагрузке, где идентификатор совпадает с else $. 'studentMarks' (исходные оценки) - person Karthik; 13.04.2021