【问题标题】:Mule 4 : Dataweave : How to filter, and update a matched object in a list?Mule 4:Dataweave:如何过滤和更新列表中的匹配对象?
【发布时间】:2021-07-07 04:45:06
【问题描述】:

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

【问题讨论】:

    标签: dataweave mule4


    【解决方案1】:

    虽然在 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")
    

    【讨论】:

      【解决方案2】:

      请查看此 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
        }
      ]
      

      【讨论】:

      • 感谢您的回答。你能解释一下语法吗?你是怎么想出来的?
      • @BibekKr.Bazaz 由于 ($ - 'studentMarks') 在 map 内,它将从原始有效负载中删除所有 studentMarks 字段。现在我手动检查 ID 是否与所需 ID 匹配,然后附加 (++) "studentMarks" 到 60 到 ID 匹配的原始有效负载 else $.'studentMarks' (原始标记)
      【解决方案3】:
      %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
      })
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2021-02-10
      • 2021-02-23
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 2021-12-05
      • 2016-03-02
      • 1970-01-01
      相关资源
      最近更新 更多