Mule 4:Dataweave:如何过滤和更新列表中的匹配对象?

Mule 4 : Dataweave : How to filter, and update a matched object in a list?

场景:我有一个学生列表。我想过滤具有特定 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
  }
]

请检查此DW。未使用 update 运算符。只有条件逻辑。如果您有任何动态类型的要求并且没有硬编码,请告诉我,我会尝试更新我的答案。

%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
  }
]

虽然更新运算符是在 Mule 4.3 中添加的,但自 Mule 4.2 以来,Values 包中有一个 update() function

我建议避免修复 id,因此我会将更改封装在一个函数中以对其进行参数化:

%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")
%dw 2.0
output application/json
---
(payload filter ($.studentId !='656b247f-a755-476f-a845-b61d28e4be79')) ++ (payload filter ($.studentId=='656b247f-a755-476f-a845-b61d28e4be79') map {
    "studentId": $.studentId,
    "studentName": $.studentName,
    "studentMarks": 60
})