如何通过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()
代码逻辑说明
- 外层
$map:遍历每个用户对象,将用户信息传入内层处理 - 内层
$map:遍历当前用户的userSkillLevels数组,把用户名和单个技能的名称、等级组合成目标对象 $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
相关产品推荐
相关产品推荐

