{"id":13533,"date":"2022-07-06T13:37:00","date_gmt":"2022-07-06T20:37:00","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=13533"},"modified":"2025-06-13T22:40:18","modified_gmt":"2025-06-14T05:40:18","slug":"eventing-data-consolidation-in-couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/eventing-data-consolidation-in-couchbase\/","title":{"rendered":"Usando o Eventing Service para consolidar dados de v\u00e1rias fontes"},"content":{"rendered":"<p><span style=\"font-weight: 400\">Uma das muitas vantagens de usar um banco de dados baseado em documentos, como o Couchbase, \u00e9 a capacidade de usar um modelo de dados flex\u00edvel para armazenar dados sem as restri\u00e7\u00f5es de um esquema r\u00edgido e predeterminado. Muitos clientes escolhem um banco de dados NoSQL para suportar a ingest\u00e3o de dados de v\u00e1rias fontes. Mas e se voc\u00ea precisar que seus dados sejam transformados para que correspondam aos dados existentes? Talvez voc\u00ea precise de todos eles em um formato uniforme para fins de relat\u00f3rio. Seja qual for o motivo, esse \u00e9 um uso perfeito para o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/eventing\/\">Servi\u00e7o de eventos<\/a> no Couchbase.<\/span><\/p>\n<h2>Servi\u00e7o de eventos do Couchbase<\/h2>\n<p><span style=\"font-weight: 400\">O servi\u00e7o de eventos \u00e9 um recurso interno do Couchbase Enterprise Edition que permite a aplica\u00e7\u00e3o de fun\u00e7\u00f5es JavaScript, <\/span><span style=\"font-weight: 400\">ou <em>lambdas<\/em><\/span><span style=\"font-weight: 400\">que respondem a eventos de muta\u00e7\u00e3o. Sempre que um documento \u00e9 criado, modificado ou exclu\u00eddo, uma a\u00e7\u00e3o pode ser executada <\/span><span style=\"font-weight: 400\">por <em>execu\u00e7\u00e3o de l\u00f3gica comercial pura em seu JavaScript<\/em><\/span><span style=\"font-weight: 400\">. H\u00e1 v\u00e1rias a\u00e7\u00f5es que podem ser executadas, como enriquecimento de dados, chamada de fluxos de trabalho externos (por meio de chamadas \u00e0 API RESTful) e eventos baseados em cron\u00f4metro (retomada da execu\u00e7\u00e3o no futuro). Pense nos eventos como um banco de dados legado <\/span><span style=\"font-weight: 400\">p\u00f3s<\/span><span style=\"font-weight: 400\">gatilho com esteroides.<\/span><\/p>\n<h2>Consolida\u00e7\u00e3o de dados<\/h2>\n<p><span style=\"font-weight: 400\">Neste exemplo simplificado, imagine que voc\u00ea acabou de adquirir duas novas fontes de dados de clientes. Esses dados podem ser provenientes de uma fonte normalizada, de um arquivo simples ou de ambos, e voc\u00ea deseja que esses dados correspondam aos dados de clientes existentes armazenados em um formato desnormalizado.<\/span><\/p>\n<p><span style=\"font-weight: 400\">A primeira fonte de dados \u00e9 um banco de dados normalizado (<\/span><span style=\"font-weight: 400\">limpo e preciso) <\/span><span style=\"font-weight: 400\">contendo clientes no Canad\u00e1. Cada registro de cliente aponta para um endere\u00e7o de cobran\u00e7a e um endere\u00e7o de entrega, e cada endere\u00e7o \u00e9 normalizado para eliminar a redund\u00e2ncia de dados de cidade e prov\u00edncia:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13534\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/image6-1024x552.png\" alt=\"Normalized datasource for eventing\" width=\"900\" height=\"485\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image6-1024x552.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image6-300x162.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image6-768x414.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image6-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image6.png 1084w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><br \/>\n<span style=\"font-weight: 400\">A segunda fonte de dados \u00e9 um arquivo simples que tamb\u00e9m cont\u00e9m clientes canadenses, mas que n\u00e3o rastreia endere\u00e7os de cobran\u00e7a e de envio separados. Como voc\u00ea pode ver, <\/span><span style=\"font-weight: 400\">apenas um \u00fanico elemento de dados de endere\u00e7o<\/span><span style=\"font-weight: 400\"> \u00e9 armazenado no registro do cliente:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13535\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/image10.png\" alt=\"Customer table, data model of single address data\" width=\"462\" height=\"600\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image10.png 462w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image10-231x300.png 231w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image10-300x390.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image10-15x20.png 15w\" sizes=\"auto, (max-width: 462px) 100vw, 462px\" \/><\/p>\n<p><span style=\"font-weight: 400\">Precisamos transformar esses dados \u00e0 medida que eles chegam para que correspondam ao nosso banco de dados de clientes existente, que \u00e9 desnormalizado, de modo que os endere\u00e7os de cobran\u00e7a e envio sejam anexados aos dados do cliente (<\/span><span style=\"font-weight: 400\">da segunda fonte<\/span><span style=\"font-weight: 400\">) como subdocumentos:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13536\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/image7-1024x238.png\" alt=\"Creating sub-documents on denormalzied data model\" width=\"900\" height=\"209\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image7-1024x238.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image7-300x70.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image7-768x178.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image7-1536x357.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image7-20x5.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image7-1320x307.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image7.png 1636w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><span style=\"font-weight: 400\">Vamos come\u00e7ar com <\/span><span style=\"font-weight: 400\">f\u00e1cil<\/span><span style=\"font-weight: 400\"> A primeira solu\u00e7\u00e3o \u00e9 a importa\u00e7\u00e3o de arquivos simples. O processo de transforma\u00e7\u00e3o desses dados envolve a c\u00f3pia dos dados do cliente (nome, e-mail, telefone, nome da empresa) em um novo documento. Em seguida, os dados de endere\u00e7o precisam ser copiados em subdocumentos para os endere\u00e7os de faturamento e de correspond\u00eancia. Como temos apenas um endere\u00e7o por cliente, copiaremos esse endere\u00e7o para o subdocumento de endere\u00e7o de faturamento e de correspond\u00eancia:<\/span><\/p>\n<h2><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13537\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/image5-1024x706.png\" alt=\"Importing and transforming subdocuments\" width=\"900\" height=\"621\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image5-1024x706.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image5-300x207.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image5-768x530.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image5-1536x1059.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image5-20x14.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image5-1320x910.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image5.png 1636w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><br \/>\n<span style=\"font-weight: 400\">C\u00f3digo JavaScript para consolidar as tabelas<\/span><\/h2>\n<p><span style=\"font-weight: 400\">O c\u00f3digo do Eventing para realizar isso \u00e9 bastante simples:<\/span><\/p>\n<pre class=\"nums:false nums-toggle:false decode-attributes:false lang:js decode:true\"> \u00a01 function OnUpdate(doc, meta) {\r\n\u00a0\u00a02 \u00a0 \u00a0 const new_doc = {}; \/\/ New customer document\r\n\u00a0\u00a03 \u00a0 \u00a0 const address = {}; \/\/ New address document\r\n\u00a0\u00a04\r\n\u00a0\u00a05 \u00a0 \u00a0 new_doc['first_name'] = doc.first_name;\r\n\u00a0\u00a06 \u00a0 \u00a0 new_doc['last_name'] = doc.last_name;\r\n\u00a0\u00a07 \u00a0 \u00a0 new_doc['email'] = doc.email;\r\n\u00a0\u00a08 \u00a0 \u00a0 new_doc['phone'] = doc.phone;\r\n\u00a0\u00a09 \u00a0 \u00a0 new_doc['company_name'] = doc.company_name;\r\n\u00a010\r\n\u00a011 \u00a0 \u00a0 address['street_address_1'] = doc.street_address_1;\r\n\u00a012 \u00a0 \u00a0 address['street_address_2'] = doc.street_address_2;\r\n\u00a013 \u00a0 \u00a0 address['city'] = doc.city;\r\n\u00a014 \u00a0 \u00a0 address['state'] = doc.province;\r\n\u00a015 \u00a0 \u00a0 address['zip_code'] = doc.postal_code;\r\n\u00a016\r\n\u00a017 \u00a0 \u00a0 \/\/ Add address document to customer document as subdocuments\r\n\u00a018 \u00a0 \u00a0 new_doc['billing_address'] = address;\r\n\u00a019 \u00a0 \u00a0 new_doc['mailing_address'] = address;\r\n\u00a020\r\n\u00a021 \u00a0 \u00a0 \/\/ This creates the new document in the destination bucket\r\n\u00a022 \u00a0 \u00a0 dest_bkt[doc.email] = new_doc;\r\n\u00a023\r\n\u00a024 \u00a0 \u00a0 \/\/ Delete original document - uncomment below\r\n\u00a025 \u00a0 \u00a0 \/\/ delete sch2[meta.id];\r\n\u00a026\r\n\u00a027 \u00a0 \u00a0 log(\"Doc created\/updated\", meta.id);\r\n\u00a028 }<\/pre>\n<p><span style=\"font-weight: 400\">O c\u00f3digo acima deve ser f\u00e1cil de entender, mesmo para programadores que n\u00e3o trabalham com JavaScript, mas vou dividi-lo por se\u00e7\u00e3o para ter certeza.<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><span style=\"font-weight: 400\"><em>Linha 1<\/em> acima \u00e9 chamado sempre que um documento no compartimento de origem sofre muta\u00e7\u00e3o (\u00e9 criado ou modificado). Veremos a seguir como definimos o compartimento de origem.<\/span><\/li>\n<li><span style=\"font-weight: 400\">As linhas 2 a 3 criam objetos JavaScript para manter o novo documento do cliente e o documento de endere\u00e7o que ser\u00e3o usados como subdocumentos dentro do documento do cliente.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>Linhas 5-15<\/em> copiar as propriedades do documento original para os objetos de cliente e endere\u00e7o.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>Linhas 18 e 19<\/em> atribuir o documento de endere\u00e7o como subdocumentos do cliente para as propriedades de endere\u00e7o de correspond\u00eancia e de faturamento.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>Linha 22<\/em> realmente cria o documento no bucket de destino do Couchbase. Veremos a seguir como definimos o bucket de destino.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>Finalmente, linha 25<\/em> excluir\u00e1 o documento original, embora ele esteja comentado aqui.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>Linha 27<\/em> registra a opera\u00e7\u00e3o. Talvez voc\u00ea queira comentar\/remover isso ap\u00f3s o teste.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Configurar o ambiente<\/h2>\n<p><span style=\"font-weight: 400\">Para testar esse script, precisaremos configurar nosso ambiente do Couchbase. Em primeiro lugar, precisaremos de um cluster do Couchbase que execute o servi\u00e7o de dados e o servi\u00e7o de eventos. Ele pode ser pequeno, como um cluster de n\u00f3 \u00fanico em execu\u00e7\u00e3o no Docker, ou um cluster maior de v\u00e1rios n\u00f3s em execu\u00e7\u00e3o no Capella.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Quando o cluster estiver em funcionamento, precisaremos criar os buckets para importar dados e um bucket de destino final. O servi\u00e7o de eventos tamb\u00e9m requer um bucket de metadados. Crie os quatro buckets a seguir, cada um com a cota m\u00ednima exigida de 100 MB:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"font-weight: 400\"><em><span style=\"font-weight: 400\">esquema1<\/span><\/em><\/li>\n<li style=\"font-weight: 400\"><em><span style=\"font-weight: 400\">esquema2<\/span><\/em><\/li>\n<li style=\"font-weight: 400\"><em><span style=\"font-weight: 400\">cliente<\/span><\/em><\/li>\n<li style=\"font-weight: 400\"><em><span style=\"font-weight: 400\">eventing_merge\u00a0<\/span><\/em><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">Tamb\u00e9m recomendo ativar <em>descarga<\/em> para este exerc\u00edcio.<\/span><\/p>\n<h3>Cria\u00e7\u00e3o de uma fun\u00e7\u00e3o de eventos<\/h3>\n<p><span style=\"font-weight: 400\">Agora precisamos criar a fun\u00e7\u00e3o de eventos. Selecione a fun\u00e7\u00e3o <strong>eventos<\/strong> e, em seguida, clique em <strong>Adicionar fun\u00e7\u00e3o<\/strong>. Use as seguintes configura\u00e7\u00f5es:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13538\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/image3-727x1024.png\" alt=\"Eventing function settings in Couchbase\" width=\"727\" height=\"1024\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image3-727x1024.png 727w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image3-213x300.png 213w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image3-768x1082.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image3-1090x1536.png 1090w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image3-300x423.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image3-14x20.png 14w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image3.png 1280w\" sizes=\"auto, (max-width: 727px) 100vw, 727px\" \/><\/p>\n<p><span style=\"font-weight: 400\">Em seguida, clique em <strong>Pr\u00f3ximo: Adicionar c\u00f3digo<\/strong>\u00a0e substitua o padr\u00e3o <em>Sobre a atualiza\u00e7\u00e3o<\/em> com o c\u00f3digo acima. Clique em <strong>Salvar<\/strong> <strong>e Retorno<\/strong>. Neste ponto, o c\u00f3digo foi armazenado, mas a fun\u00e7\u00e3o precisa ser implementada para que possa come\u00e7ar a processar os dados. Clique no nome da fun\u00e7\u00e3o para abrir suas configura\u00e7\u00f5es e implemente a fun\u00e7\u00e3o agora.<\/span><\/p>\n<h3>Cria\u00e7\u00e3o de documentos JSON de teste<\/h3>\n<p><span style=\"font-weight: 400\">Agora, vamos test\u00e1-lo criando um documento na pasta <em>esquema2<\/em> balde. Adicione um documento usando <\/span><em><span style=\"font-weight: 400\">wile.e.coyote@acmecorp.com<\/span><\/em><span style=\"font-weight: 400\">\u00a0como a chave do documento e com o seguinte corpo de documento:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n\u00a0\u00a0\"customer_id\": null,\r\n\u00a0\u00a0\"first_name\": \"Wile\",\r\n\u00a0\u00a0\"middle_name\": \"E\",\r\n\u00a0\u00a0\"last_name\": \"Coyote\",\r\n\u00a0\u00a0\"email\": \"wile.e.coyote@acmecorp.com\",\r\n\u00a0\u00a0\"title\": \"Genius\",\r\n\u00a0\u00a0\"company_name\": \"Acme Corporation\",\r\n\u00a0\u00a0\"phone\": \"123-555-1212\",\r\n\u00a0\u00a0\"street_address_1\": \"694 York Circle\",\r\n\u00a0\u00a0\"street_address_2\": \"\",\r\n\u00a0\u00a0\"city\": \"Hackettstown\",\r\n\u00a0\u00a0\"province\": \"NJ\",\r\n\u00a0\u00a0\"postal_code\": \"07840\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400\">Em instantes, voc\u00ea ver\u00e1 que as estat\u00edsticas do evento indicam sucesso:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13539\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/image2.png\" alt=\"event status feedback\" width=\"850\" height=\"274\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image2.png 850w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image2-300x97.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image2-768x248.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image2-20x6.png 20w\" sizes=\"auto, (max-width: 850px) 100vw, 850px\" \/><\/p>\n<p><span style=\"font-weight: 400\">Agora d\u00ea uma olhada no <em>cliente<\/em> e voc\u00ea ver\u00e1 que o documento acima foi transformado. Observe como o endere\u00e7o agora existe como subdocumentos dentro das propriedades <em>endere\u00e7o de cobran\u00e7a<\/em>\u00a0e <em>endere\u00e7o de correspond\u00eancia<\/em>:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13540\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/image11.png\" alt=\"sampel JSON document for addresses\" width=\"740\" height=\"778\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image11.png 740w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image11-285x300.png 285w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image11-300x315.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image11-20x20.png 20w\" sizes=\"auto, (max-width: 740px) 100vw, 740px\" \/><\/p>\n<h2>Transforma\u00e7\u00e3o em subdocumentos<\/h2>\n<p><span style=\"font-weight: 400\">Agora vamos abordar a transforma\u00e7\u00e3o mais complexa do esquema. A migra\u00e7\u00e3o da estrutura relacional para corresponder \u00e0 nossa estrutura de subdocumento \u00e9 mais ou menos assim:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13541\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/image1-1024x727.png\" alt=\"Migrating the relational structure to match our sub-document structure\" width=\"900\" height=\"639\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image1-1024x727.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image1-300x213.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image1-768x545.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image1-1536x1090.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image1-20x14.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image1-1320x937.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image1.png 1730w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><br \/>\n<span style=\"font-weight: 400\">Precisaremos desnormalizar as tabelas de endere\u00e7o e c\u00f3digo postal em um \u00fanico subdocumento, um para cada endere\u00e7o de remessa\/correio e outro para o endere\u00e7o de cobran\u00e7a. Nesse caso, os dados das tr\u00eas tabelas s\u00e3o armazenados em cole\u00e7\u00f5es dentro do bucket.\u00a0<\/span><\/p>\n<h2><span style=\"font-weight: 400\">C\u00f3digo JavaScript para desnormaliza\u00e7\u00e3o<\/span><\/h2>\n<pre class=\"nums:false nums-toggle:false decode-attributes:false lang:js decode:true\"> \u00a01 function OnUpdate(doc, meta) {\r\n\u00a0\u00a02 \u00a0 \u00a0 let new_doc = {};\r\n\u00a0\u00a03 \u00a0 \u00a0 let bill_addr = {};\r\n\u00a0\u00a04 \u00a0 \u00a0 let mail_addr = {};\r\n\u00a0\u00a05\r\n\u00a0\u00a06 \u00a0 \u00a0 new_doc['first_name'] = doc.first_name;\r\n\u00a0\u00a07 \u00a0 \u00a0 new_doc['last_name'] = doc.last_name;\r\n\u00a0\u00a08 \u00a0 \u00a0 new_doc['email'] = doc.email;\r\n\u00a0\u00a09 \u00a0 \u00a0 new_doc['phone'] = doc.phone;\r\n\u00a010 \u00a0 \u00a0 new_doc['company_name'] = doc.company_name;\r\n\u00a011\r\n\u00a012 \u00a0 \u00a0 bill_addr = bkt_addr[doc.billing_address_id];\r\n\u00a013 \u00a0 \u00a0 mail_addr = bkt_addr[doc.shipping_address_id];\r\n\u00a014\r\n\u00a015 \u00a0 \u00a0 bill_addr['city'] = bkt_pc[bkt_addr[doc.billing_address_id].postal_code].city;\r\n\u00a016 \u00a0 \u00a0 mail_addr['city'] = bkt_pc[bkt_addr[doc.shipping_address_id].postal_code].city;\r\n\u00a017\r\n\u00a018 \u00a0 \u00a0 bill_addr['state'] = bkt_pc[bkt_addr[doc.billing_address_id].postal_code].province;\r\n\u00a019 \u00a0 \u00a0 mail_addr['state'] = bkt_pc[bkt_addr[doc.shipping_address_id].postal_code].province;\r\n\u00a020\r\n\u00a021 \u00a0 \u00a0 new_doc['billing_address'] = bill_addr;\r\n\u00a022 \u00a0 \u00a0 new_doc['mailing_address'] = mail_addr;\r\n\u00a023\r\n\u00a024 \u00a0 \u00a0 log(new_doc);\r\n\u00a025\r\n\u00a026 \u00a0 \u00a0 dest_bkt[doc.email] = new_doc;\r\n\u00a027\r\n\u00a028 \u00a0 \u00a0 \/\/ Delete existing customer (leave address\/postal_code for other customers who share this)\r\n\u00a029 \u00a0 \u00a0 \/\/ delete bkt_cust[meta.id];\r\n\u00a030 \u00a0 \u00a0 log(\"Doc created\/updated\", meta.id);\r\n\u00a031 }<\/pre>\n<p><span style=\"font-weight: 400\">Vamos decompor esse c\u00f3digo novamente como antes.<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><span style=\"font-weight: 400\"><em>Linhas 2-4<\/em> criar objetos JavaScript para armazenar o novo documento, bem como os subdocumentos para os endere\u00e7os de correspond\u00eancia e de cobran\u00e7a.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>Linhas 6-10<\/em> copie as propriedades do contato para o novo documento.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>Linhas 12 e 13<\/em> copie os dados de endere\u00e7o da cole\u00e7\u00e3o de endere\u00e7os usando a chave de documento armazenada na propriedade address_id do contato.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>Linhas 15-19<\/em> extrai os dados da cidade e da prov\u00edncia da cole\u00e7\u00e3o de prov\u00edncias, usando o province_id do documento de endere\u00e7o como a chave do documento.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>Linhas 21 e 22<\/em> em seguida, anexe esses objetos de documento como subdocumentos ao novo documento de contato.<\/span><\/li>\n<li><span style=\"font-weight: 400\">Finalmente, <em>linha 26<\/em> grava o novo documento no bucket de destino. <\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>Linha 29<\/em>se n\u00e3o for comentado, excluir\u00e1 o documento original do contato do bucket de origem. Observe que n\u00e3o queremos excluir tamb\u00e9m os documentos de endere\u00e7o e prov\u00edncia associados, pois eles podem ser usados por outros contatos.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Cria\u00e7\u00e3o da fun\u00e7\u00e3o de eventos para desnormaliza\u00e7\u00e3o<\/h2>\n<p><span style=\"font-weight: 400\">Crie essa fun\u00e7\u00e3o de evento usando as seguintes configura\u00e7\u00f5es e cole o c\u00f3digo acima para substituir o <em>Sobre a atualiza\u00e7\u00e3o<\/em> fun\u00e7\u00e3o. Quando terminar, v\u00e1 em frente e implemente a fun\u00e7\u00e3o.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13542\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/image4-556x1024.png\" alt=\"Setting up an eventing function in Couchbase\" width=\"556\" height=\"1024\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image4-556x1024.png 556w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image4-163x300.png 163w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image4-768x1414.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image4-834x1536.png 834w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image4-300x552.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image4-11x20.png 11w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image4.png 1086w\" sizes=\"auto, (max-width: 556px) 100vw, 556px\" \/><\/p>\n<p><span style=\"font-weight: 400\">Para testar essa fun\u00e7\u00e3o, precisaremos criar cole\u00e7\u00f5es no <em>esquema1<\/em> (use o <em>padr\u00e3o<\/em> ) com os nomes: <em>endere\u00e7os<\/em>, <em>clientes<\/em>, <em>c\u00f3digos postais<\/em>. Em seguida, crie os seguintes documentos (nesta ordem, caso contr\u00e1rio, as pesquisas na fun\u00e7\u00e3o falhar\u00e3o):<\/span><\/p>\n<p><span style=\"font-weight: 400\"><em>C\u00f3digos postais<\/em> com a ID do documento <\/span><span style=\"font-weight: 400\"><em>43062<\/em>:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n\u00a0\u00a0\"postal_code\": \"43062\",\r\n\u00a0\u00a0\"city\": \"Pataskala\",\r\n\u00a0\u00a0\"province\": \"OH\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400\"><em>C\u00f3digos postais<\/em> com a ID do documento <\/span><span style=\"font-weight: 400\"><em>23228<\/em>:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n\u00a0\u00a0\"postal_code\": \"23228\",\r\n\u00a0\u00a0\"city\": \"Henrico\",\r\n\u00a0\u00a0\"province\": \"VA\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400\"><em>Endere\u00e7os<\/em> com a ID do documento <em>000071<\/em>:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n\u00a0\u00a0\"address_id\": \"000071\",\r\n\u00a0\u00a0\"street_address_1\": \"85 Hartford Road\",\r\n\u00a0\u00a0\"street_address_2\": \"\",\r\n\u00a0\u00a0\"postal_code\": \"23228\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400\"><em>Endere\u00e7os<\/em> com a ID do documento <em>000086<\/em>:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n\u00a0\u00a0\"address_id\": \"000086\",\r\n\u00a0\u00a0\"street_address_1\": \"460 Broad Dr.\",\r\n\u00a0\u00a0\"street_address_2\": \"\",\r\n\u00a0\u00a0\"postal_code\": \"43062\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400\">Por fim, no <em>clientes<\/em> com a ID do documento <\/span><em><span style=\"font-weight: 400\">blinded_by@science.com<\/span><\/em><span style=\"font-weight: 400\">:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n\u00a0\u00a0\"customer_id\": null,\r\n\u00a0\u00a0\"first_name\": \"Thomas\",\r\n\u00a0\u00a0\"middle_name\": null,\r\n\u00a0\u00a0\"last_name\": \"Dolby\",\r\n\u00a0\u00a0\"email\": \"blinded_by@science.com\",\r\n\u00a0\u00a0\"title\": null,\r\n\u00a0\u00a0\"phone\": \"867-5309\",\r\n\u00a0\u00a0\"billing_address_id\": \"000086\",\r\n\u00a0\u00a0\"shipping_address_id\": \"000071\",\r\n\u00a0\u00a0\"company_name\": \"The Golden Age of Wireless\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400\">Em pouco tempo, voc\u00ea ver\u00e1 que as estat\u00edsticas dessa fun\u00e7\u00e3o s\u00e3o bem-sucedidas:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13543\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/image8.png\" alt=\"Function success status\" width=\"764\" height=\"244\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image8.png 764w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image8-300x96.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image8-20x6.png 20w\" sizes=\"auto, (max-width: 764px) 100vw, 764px\" \/><\/p>\n<p><span style=\"font-weight: 400\">E se voc\u00ea observar o documento no compartimento de clientes, ver\u00e1 a seguinte transforma\u00e7\u00e3o com os dois endere\u00e7os desnormalizados em subdocumentos.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13544\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/image9.png\" alt=\"Automatic denormalization of JSON documents using eventing\" width=\"672\" height=\"734\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image9.png 672w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image9-275x300.png 275w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image9-300x328.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image9-18x20.png 18w\" sizes=\"auto, (max-width: 672px) 100vw, 672px\" \/><\/p>\n<h2>Considera\u00e7\u00f5es finais<\/h2>\n<p><span style=\"font-weight: 400\">Este \u00e9 um exemplo muito simplista. Em um ambiente de produ\u00e7\u00e3o, voc\u00ea provavelmente adicionar\u00e1 c\u00f3digo para tratar exce\u00e7\u00f5es.\u00a0\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Al\u00e9m disso, voc\u00ea pode aumentar o n\u00famero de workers de 1 para o n\u00famero de vCPUs se tiver um conjunto de dados grande e precisar de mais desempenho<\/span><span style=\"font-weight: 400\">.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">As fun\u00e7\u00f5es de eventos usadas neste blog podem ser encontradas no seguinte reposit\u00f3rio do github: <\/span><a href=\"https:\/\/github.com\/djames42\/cb_eventing_merge\"><span style=\"font-weight: 400\">https:\/\/github.com\/djames42\/cb_eventing_merge<\/span><\/a><span style=\"font-weight: 400\">. Nesse reposit\u00f3rio, h\u00e1 tamb\u00e9m alguns scripts (um script Bash e um script Python) que podem ser usados para criar um cluster de n\u00f3 \u00fanico com as fun\u00e7\u00f5es de eventos e conjuntos de dados de amostra maiores pr\u00e9-carregados.<\/span><\/p>\n<h2>Recursos<\/h2>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"font-weight: 400\"><i><span style=\"font-weight: 400\">Download:<\/span><\/i><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/?ref=blog\"><span style=\"font-weight: 400\"> Baixar o Couchbase Server 7.1<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><i><span style=\"font-weight: 400\">GitHub:<\/span><\/i> <a href=\"https:\/\/github.com\/djames42\/cb_eventing_merge\"><span style=\"font-weight: 400\">https:\/\/github.com\/djames42\/cb_eventing_merge<\/span><\/a><span style=\"font-weight: 400\">.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Refer\u00eancias<\/h2>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/docs.couchbase.com\/server\/6.6\/eventing\/eventing-overview.html?ref=blog\"><span style=\"font-weight: 400\">Documenta\u00e7\u00e3o de eventos do Couchbase<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/whats-new-in-couchbase-server-7-1\/\"><span style=\"font-weight: 400\">O que h\u00e1 de novo: Couchbase Server 7.1<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/tag\/eventing\/?ref=blog\"><span style=\"font-weight: 400\">Outros blogs do Couchbase sobre eventos<\/span><\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>One of the many advantages of using a document-based database such as Couchbase is the ability to use a flexible data model to store data without the constraints of a rigid, predetermined schema. Many customers choose a NoSQL database to [&hellip;]<\/p>","protected":false},"author":69851,"featured_media":13547,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,2273,9327],"tags":[2226,1447,1450,2100],"ppma_author":[9688],"class_list":["post-13533","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-eventing","category-javascript","tag-couchbase-functions","tag-data-modeling","tag-document-normalization","tag-lambda"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Using the Eventing Service to Consolidate Data from Multiple Sources<\/title>\n<meta name=\"description\" content=\"Couchbase eventing functions can be used to help consolidate data from differing sources\/data models, here we denormalize tables on the fly.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/eventing-data-consolidation-in-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Using the Eventing Service to Consolidate Data from Multiple Sources\" \/>\n<meta property=\"og:description\" content=\"Couchbase eventing functions can be used to help consolidate data from differing sources\/data models, here we denormalize tables on the fly.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/eventing-data-consolidation-in-couchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-07-06T20:37:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T05:40:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image_2022-07-06_133336281.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2163\" \/>\n\t<meta property=\"og:image:height\" content=\"1535\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Daniel James, Senior Solutions Engineer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Daniel James, Senior Solutions Engineer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/\"},\"author\":{\"name\":\"DanielJames\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/be62ea90bcc04b8ec2df1755e6e186d7\"},\"headline\":\"Using the Eventing Service to Consolidate Data from Multiple Sources\",\"datePublished\":\"2022-07-06T20:37:00+00:00\",\"dateModified\":\"2025-06-14T05:40:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/\"},\"wordCount\":1366,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image_2022-07-06_133336281.png\",\"keywords\":[\"Couchbase Functions\",\"Data Modeling\",\"Document Normalization\",\"lambda\"],\"articleSection\":[\"Couchbase Server\",\"Eventing\",\"JavaScript\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/\",\"name\":\"Using the Eventing Service to Consolidate Data from Multiple Sources\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image_2022-07-06_133336281.png\",\"datePublished\":\"2022-07-06T20:37:00+00:00\",\"dateModified\":\"2025-06-14T05:40:18+00:00\",\"description\":\"Couchbase eventing functions can be used to help consolidate data from differing sources\/data models, here we denormalize tables on the fly.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image_2022-07-06_133336281.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image_2022-07-06_133336281.png\",\"width\":2163,\"height\":1535},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Using the Eventing Service to Consolidate Data from Multiple Sources\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/be62ea90bcc04b8ec2df1755e6e186d7\",\"name\":\"DanielJames\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/1808e27bf0c87c8e9f636c9636d84c88\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/f467ae6133e0e29b659987b13b695261d798c1763f401e09631151e72bcb73b3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/f467ae6133e0e29b659987b13b695261d798c1763f401e09631151e72bcb73b3?s=96&d=mm&r=g\",\"caption\":\"DanielJames\"},\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/danieljames\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Usando o Eventing Service para consolidar dados de v\u00e1rias fontes","description":"As fun\u00e7\u00f5es de eventos do Couchbase podem ser usadas para ajudar a consolidar dados de diferentes fontes\/modelos de dados; aqui, desnormalizamos as tabelas em tempo real.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/eventing-data-consolidation-in-couchbase\/","og_locale":"pt_BR","og_type":"article","og_title":"Using the Eventing Service to Consolidate Data from Multiple Sources","og_description":"Couchbase eventing functions can be used to help consolidate data from differing sources\/data models, here we denormalize tables on the fly.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/eventing-data-consolidation-in-couchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2022-07-06T20:37:00+00:00","article_modified_time":"2025-06-14T05:40:18+00:00","og_image":[{"width":2163,"height":1535,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image_2022-07-06_133336281.png","type":"image\/png"}],"author":"Daniel James, Senior Solutions Engineer","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Daniel James, Senior Solutions Engineer","Est. reading time":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/"},"author":{"name":"DanielJames","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/be62ea90bcc04b8ec2df1755e6e186d7"},"headline":"Using the Eventing Service to Consolidate Data from Multiple Sources","datePublished":"2022-07-06T20:37:00+00:00","dateModified":"2025-06-14T05:40:18+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/"},"wordCount":1366,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image_2022-07-06_133336281.png","keywords":["Couchbase Functions","Data Modeling","Document Normalization","lambda"],"articleSection":["Couchbase Server","Eventing","JavaScript"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/","name":"Usando o Eventing Service para consolidar dados de v\u00e1rias fontes","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image_2022-07-06_133336281.png","datePublished":"2022-07-06T20:37:00+00:00","dateModified":"2025-06-14T05:40:18+00:00","description":"As fun\u00e7\u00f5es de eventos do Couchbase podem ser usadas para ajudar a consolidar dados de diferentes fontes\/modelos de dados; aqui, desnormalizamos as tabelas em tempo real.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image_2022-07-06_133336281.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image_2022-07-06_133336281.png","width":2163,"height":1535},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Using the Eventing Service to Consolidate Data from Multiple Sources"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/be62ea90bcc04b8ec2df1755e6e186d7","name":"DanielJames","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/1808e27bf0c87c8e9f636c9636d84c88","url":"https:\/\/secure.gravatar.com\/avatar\/f467ae6133e0e29b659987b13b695261d798c1763f401e09631151e72bcb73b3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f467ae6133e0e29b659987b13b695261d798c1763f401e09631151e72bcb73b3?s=96&d=mm&r=g","caption":"DanielJames"},"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/danieljames\/"}]}},"authors":[{"term_id":9688,"user_id":69851,"is_guest":0,"slug":"danieljames","display_name":"Daniel James, Senior Solutions Engineer","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/f467ae6133e0e29b659987b13b695261d798c1763f401e09631151e72bcb73b3?s=96&d=mm&r=g","author_category":"","last_name":"James","first_name":"Daniel","job_title":"","user_url":"","description":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/13533","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/69851"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=13533"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/13533\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13547"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=13533"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=13533"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=13533"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=13533"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}