如何在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": "" // 移除临时存储的对象 } } ]
关键调整说明
- 第一步shift操作修改:将司机信息存储到以
cpf_motorista为键的motoristasByCpf对象中,相同CPF的司机信息会自动覆盖,实现去重。 - 新增shift操作:将
motoristasByCpf中的值提取为motoristas数组,恢复目标结构。 - 拆分default操作:原default中对motoristas的设置移到新增shift之后,确保数组生成后再添加默认字段。
- remove操作新增:移除临时使用的
motoristasByCpf对象,清理冗余数据。
经过上述调整,motoristas数组将仅保留唯一的司机记录。
内容的提问来源于stack exchange,提问作者Rodrigo Hajime Himauari
相关产品推荐
相关产品推荐

