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

如何在Jolt转换中实现motoristas数组去重(仅存单条记录)

解决Jolt转换中motoristas数组重复记录问题

问题说明

现有包含两条货运单据的JSON数组,使用当前Jolt规则转换后,motoristas数组出现重复的司机记录,需要调整规则使该数组仅保留唯一的司机条目。

原始输入JSON

[
  {
    "oid_notas": 12750,
    "unidade": "BRYE",
    "nota_fiscal": "182477",
    "serie_nota_fiscal": null,
    "nota_fiscal_interno": null,
    "data_nota": null,
    "embarque": "64167625",
    "cep_origem": "37640000",
    "cep_destino": "36092005",
    "cnpj_transportadora": "34334442000196",
    "cnpj_destinatario": "17745613000150",
    "cnpj_unidade": "13143802000879",
    "placa": "EDP3H17",
    "data_inicio": "2023-12-18",
    "hora_inicio": "16:39:42",
    "data_fim": "2023-12-20",
    "hora_fim": "04:26:20",
    "chave_acesso": "31231213143802000879550010001824771354201333",
    "nome_motorista": "JORGE LUIS MASSEI",
    "cpf_motorista": "18407854620"
  },
  {
    "oid_notas": 12751,
    "unidade": "BRYE",
    "nota_fiscal": "182472",
    "serie_nota_fiscal": null,
    "nota_fiscal_interno": null,
    "data_nota": null,
    "embarque": "64167625",
    "cep_origem": "37640000",
    "cep_destino": "36092005",
    "cnpj_transportadora": "34334442000196",
    "cnpj_destinatario": "17745613000150",
    "cnpj_unidade": "13143802000879",
    "placa": "EDP3H17",
    "data_inicio": "2023-12-18",
    "hora_inicio": "16:39:42",
    "data_fim": "2023-12-20",
    "hora_fim": "04:26:20",
    "chave_acesso": "31231213143802000879550010001824721154911322",
    "nome_motorista": "JORGE LUIS MASSEI",
    "cpf_motorista": "18407854620"
  }
]

当前Jolt转换规则

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "cnpj_unidade": ["cnpjUnidade", "documentos[#2].cnpjEmissor", "remetente.cnpj"],
        "embarque": "numeroEmbarque",
        "cep_origem": "cepOrigem",
        "cep_destino": "cepDestino",
        "placa": "placa",
        "data_inicio": "data_inicio",
        "hora_inicio": "hora_inicio",
        "data_fim": "data_fim",
        "hora_fim": "hora_fim",
        "cnpj_destinatario": "destinatario.cnpj",
        "cnpj_transportadora": "transportadora.cnpj",
        "chave_acesso": "documentos[#2].chaveAcesso",
        "cpf_motorista": "motoristas[#2].documento",
        "nome_motorista": "motoristas[#2].nome"
      }
    }
  },
  {
    "operation": "cardinality",
    "spec": {
      "cnpjUnidade": "ONE",
      "numeroEmbarque": "ONE",
      "cepOrigem": "ONE",
      "cepDestino": "ONE",
      "data_inicio": "ONE",
      "hora_inicio": "ONE",
      "data_fim": "ONE",
      "hora_fim": "ONE",
      "placa": "ONE",
      "destinatario": {
        "cnpj": "ONE"
      },
      "remetente": {
        "cnpj": "ONE"
      },
      "transportadora": {
        "cnpj": "ONE"
      }
   }
 },
 {
    "operation": "default",
    "spec": {
      "calcularcarga": false,
      "documentos[]": {
        "*": {
          "tipoDocumento": 0
        }
      },
      "motoristas[]": {
        "*": {
          "tipoDocumento": 1
        }
      }
    }
 },
 {
    "operation": "modify-overwrite-beta",
    "spec": {
      "dataEmbarque": "=concat(@(1,data_inicio),' ',@(1,hora_inicio))",
      "dataEmissao": "=concat(@(1,data_inicio),' ',@(1,hora_inicio))",
      "dataPrevisaoFimEmbarque": "=concat(@(1,data_fim),' ',@(1,hora_fim))"
    }
 },
 {
    "operation": "remove",
    "spec": {
      "data_inicio": "",
      "hora_inicio": "",
      "data_fim": "",
      "hora_fim": ""
    }
 }
]

问题点

转换后motoristas数组生成了重复的司机记录,需要实现该数组的去重,仅保留唯一条目。

调整后的Jolt规则

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "cnpj_unidade": ["cnpjUnidade", "documentos[#2].cnpjEmissor", "remetente.cnpj"],
        "embarque": "numeroEmbarque",
        "cep_origem": "cepOrigem",
        "cep_destino": "cepDestino",
        "placa": "placa",
        "data_inicio": "data_inicio",
        "hora_inicio": "hora_inicio",
        "data_fim": "data_fim",
        "hora_fim": "hora_fim",
        "cnpj_destinatario": "destinatario.cnpj",
        "cnpj_transportadora": "transportadora.cnpj",
        "chave_acesso": "documentos[#2].chaveAcesso",
        // 用cpf作为唯一键存储司机信息,自动去重
        "cpf_motorista": "motoristasByCpf.@(1,cpf_motorista).documento",
        "nome_motorista": "motoristasByCpf.@(1,cpf_motorista).nome"
      }
    }
  },
  {
    "operation": "cardinality",
    "spec": {
      "cnpjUnidade": "ONE",
      "numeroEmbarque": "ONE",
      "cepOrigem": "ONE",
      "cepDestino": "ONE",
      "data_inicio": "ONE",
      "hora_inicio": "ONE",
      "data_fim": "ONE",
      "hora_fim": "ONE",
      "placa": "ONE",
      "destinatario": {
        "cnpj": "ONE"
      },
      "remetente": {
        "cnpj": "ONE"
      },
      "transportadora": {
        "cnpj": "ONE"
      }
   }
 },
 {
    "operation": "default",
    "spec": {
      "calcularcarga": false,
      "documentos[]": {
        "*": {
          "tipoDocumento": 0
        }
      }
    }
 },
 // 新增shift操作,将去重后的司机对象转为数组
 {
    "operation": "shift",
    "spec": {
      "*": "&",
      "motoristasByCpf": {
        "*": "motoristas[]"
      }
    }
 },
 // 给motoristas数组的条目添加默认的tipoDocumento
 {
    "operation": "default",
    "spec": {
      "motoristas[]": {
        "*": {
          "tipoDocumento": 1
        }
      }
    }
 },
 {
    "operation": "modify-overwrite-beta",
    "spec": {
      "dataEmbarque": "=concat(@(1,data_inicio),' ',@(1,hora_inicio))",
      "dataEmissao": "=concat(@(1,data_inicio),' ',@(1,hora_inicio))",
      "dataPrevisaoFimEmbarque": "=concat(@(1,data_fim),' ',@(1,hora_fim))"
    }
 },
 {
    "operation": "remove",
    "spec": {
      "data_inicio": "",
      "hora_inicio": "",
      "data_fim": "",
      "hora_fim": "",
      "motoristasByCpf": "" // 移除临时存储的对象
    }
 }
]

关键调整说明

  1. 第一步shift操作修改:将司机信息存储到以cpf_motorista为键的motoristasByCpf对象中,相同CPF的司机信息会自动覆盖,实现去重。
  2. 新增shift操作:将motoristasByCpf中的值提取为motoristas数组,恢复目标结构。
  3. 拆分default操作:原default中对motoristas的设置移到新增shift之后,确保数组生成后再添加默认字段。
  4. remove操作新增:移除临时使用的motoristasByCpf对象,清理冗余数据。

经过上述调整,motoristas数组将仅保留唯一的司机记录。

内容的提问来源于stack exchange,提问作者Rodrigo Hajime Himauari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 20:07:32