繁体   English   中英

创建数组结果的 1-1 映射

[英]Creating 1-1 mapping of Array results

我正在尝试使用从 ElasticSearch 查询返回的数据,并以某种格式将其放入 jsonata 中的数组中。

本质上,我需要我的结果集是这样的:

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

但是,我得到的是:

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

我使用以下 map 结果:

(
    $data := $map(data.hits.hits._source.item."Prod::User", function($v) {
        {

            "userName": $v.userName,
            "label": $v.userSkillLevels.skill.name,
            "value": $v.userSkillLevels.level
            
            
        }
    });

)

我从 ElasticSearch 返回的整体数据集如下:

{
  "data": {
    "took": 3,
    "timed_out": false,
    "_shards": {
      "total": 15,
      "successful": 15,
      "skipped": 0,
      "failed": 0
    },
    "hits": {
      "total": {
        "value": 2,
        "relation": "eq"
      },
      "max_score": 1.002851,
      "hits": [
        {
          "_index": "items_latest_production1_user",
          "_type": "_doc",
          "_id": "63d000766f67d40a73073d5d_f6144acf2b3ff31209ef9f6d461cd849",
          "_score": 1.002851,
          "_source": {
            "item": {
              "Prod::User": {
                "userSkillLevels": [
                  {
                    "level": 3,
                    "skill": {
                      "name": "Dealer"
                    }
                  },
                  {
                    "level": 5,
                    "skill": {
                      "name": "Inquiry"
                    }
                  },
                  {
                    "level": 2,
                    "skill": {
                      "name": "DD Test Skill1"
                    }
                  },
                  {
                    "level": 1,
                    "skill": {
                      "name": "_11DavidTest"
                    }
                  }
                ],
                "userName": "david2@david2.com"
              }
            }
          }
        }
      ]
    }
  }
}

我可以看到每个从 Elastic 返回的用户,然后是与 1 个用户名关联的数组中的所有技能/级别。

我需要拥有相同数量的用户名,因为他们的技能......并且正在努力让它恰到好处。

想法? 感谢任何帮助,我确定我忽略了一些简单的事情。

实际上,需要这种格式:

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

解决此问题的一种方法是自己创建userName数组并确保它的长度与userSkillLevels.skill相同,这是您可以执行此操作的方法:

(
    $data := $map(data.hits.hits._source.item."Prod::User", function($v, $i, $a) {
        {

            "userName": $map([1..$count($v.userSkillLevels.skill)], function() {$v.userName}),
            "label": $v.userSkillLevels.skill.name,
            "value": $v.userSkillLevels.level
        }
    });
)

请随时在 Stedi JSONata Playground 中查看此回复: https://stedi.link/PVwGacu

实际上,需要这种格式:

对于您问题的更新格式,此解决方案可以使用父运算符生成它:

data.hits.hits._source.item."Prod::User".userSkillLevels.{
  "userName": %.userName,
  "label": skill.name,
  "value": level
}

在操场上查看: https://stedi.link/gexB3Cb

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM