You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JSONata将ElasticSearch返回数据转换为指定数组格式

JSONata处理ElasticSearch数据格式转换问题

问题背景

需要将ElasticSearch返回的用户技能数据,转换为每个技能对应一条包含userName、label、value的对象组成的数组。当前使用的JSONata代码得到的结果中,userName是单个值,label和value为数组,无法满足需求。

问题分析

原代码直接对Prod::User执行$map,但每个Prod::User下的userSkillLevels是数组,直接取$v.userSkillLevels.skill.name会返回数组,而$v.userName是单个值,导致结构不匹配。核心需要嵌套遍历:先遍历用户,再遍历每个用户的技能列表,将用户名与单个技能的信息组合成独立对象。

解决方案

使用嵌套$map结合$flatten()实现需求:

$data.hits.hits._source.item."Prod::User" ~> $map(function($user) {
    $user.userSkillLevels ~> $map(function($skill) {
        {
            "userName": $user.userName,
            "label": $skill.skill.name,
            "value": $skill.level
        }
    })
}) ~> $flatten()

代码逻辑说明

  1. 外层$map:遍历每个用户对象,将用户信息传入内层处理
  2. 内层$map:遍历当前用户的userSkillLevels数组,把用户名和单个技能的名称、等级组合成目标对象
  3. $flatten():将每个用户生成的技能数组展平为一维数组,得到最终的扁平化结果

输出结果验证

执行上述代码后,将得到符合需求的结构:

[
    {
        "userName": "david2@david2.com",
        "label": "Dealer",
        "value": 3
    },
    {
        "userName": "david2@david2.com",
        "label": "Inquiry",
        "value": 5
    },
    {
        "userName": "david2@david2.com",
        "label": "DD Test Skill1",
        "value": 2
    },
    {
        "userName": "david2@david2.com",
        "label": "_11DavidTest",
        "value": 1
    }
]

内容的提问来源于stack exchange,提问作者Vacek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 00:10:47