{"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\/es\/eventing-data-consolidation-in-couchbase\/","title":{"rendered":"Uso del servicio de eventos para consolidar datos de varias fuentes"},"content":{"rendered":"<p><span style=\"font-weight: 400\">Una de las muchas ventajas de utilizar una base de datos basada en documentos como Couchbase es la capacidad de utilizar un modelo de datos flexible para almacenar datos sin las restricciones de un esquema r\u00edgido y predeterminado. Muchos clientes eligen una base de datos NoSQL para soportar la ingesti\u00f3n de datos de m\u00faltiples fuentes. Pero, \u00bfqu\u00e9 ocurre si necesita que los datos se transformen para que coincidan con los existentes? Tal vez los necesite en un formato uniforme para la elaboraci\u00f3n de informes. Sea cual sea la raz\u00f3n, este es un uso perfecto para la base de datos <a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/eventing\/\">Servicio de concursos<\/a> en Couchbase.<\/span><\/p>\n<h2>Servicio de eventos Couchbase<\/h2>\n<p><span style=\"font-weight: 400\">El servicio de eventos es una caracter\u00edstica integrada de Couchbase Enterprise Edition que permite la aplicaci\u00f3n de funciones JavaScript, <\/span><span style=\"font-weight: 400\">o <em>lambdas<\/em><\/span><span style=\"font-weight: 400\">que responden a los eventos de mutaci\u00f3n. Cada vez que se crea, modifica o elimina un documento, se puede realizar una acci\u00f3n <\/span><span style=\"font-weight: 400\">por <em>ejecutar l\u00f3gica de negocio pura en JavaScript<\/em><\/span><span style=\"font-weight: 400\">. Hay una serie de acciones que pueden llevarse a cabo, como el enriquecimiento de datos, la llamada a flujos de trabajo externos (mediante llamadas a API RESTful) y eventos basados en temporizadores (reanudaci\u00f3n de la ejecuci\u00f3n en el futuro). Piense en los eventos como una base de datos heredada <\/span><span style=\"font-weight: 400\">post<\/span><span style=\"font-weight: 400\">gatillo con esteroides.<\/span><\/p>\n<h2>Consolidaci\u00f3n de datos<\/h2>\n<p><span style=\"font-weight: 400\">En este ejemplo simplificado, imagine que acaba de adquirir dos nuevas fuentes de datos de clientes. Estos datos pueden proceder de una fuente normalizada, de un archivo plano o de ambos, y desea que coincidan con los datos de clientes existentes almacenados en un formato desnormalizado.<\/span><\/p>\n<p><span style=\"font-weight: 400\">La primera fuente de datos es una base de datos normalizada (<\/span><span style=\"font-weight: 400\">limpio y preciso) <\/span><span style=\"font-weight: 400\">que contiene clientes de Canad\u00e1. Cada registro de cliente apunta a una direcci\u00f3n de facturaci\u00f3n y otra de env\u00edo, y cada direcci\u00f3n est\u00e1 normalizada para eliminar la redundancia de datos de ciudad y provincia:<\/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\">La segunda fuente de datos es un archivo plano que tambi\u00e9n contiene clientes canadienses, pero que no registra por separado las direcciones de facturaci\u00f3n y de env\u00edo. Como puede ver, <\/span><span style=\"font-weight: 400\">un \u00fanico elemento de datos de direcci\u00f3n<\/span><span style=\"font-weight: 400\"> se almacena en el registro del 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\">Tenemos que transformar estos datos a medida que llegan para que coincidan con nuestra base de datos de clientes existente, que est\u00e1 desnormalizada de forma que las direcciones de facturaci\u00f3n y env\u00edo se adjuntan a los datos del cliente (<\/span><span style=\"font-weight: 400\">de la segunda fuente<\/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\">Empecemos por <\/span><span style=\"font-weight: 400\">un f\u00e1cil<\/span><span style=\"font-weight: 400\"> soluci\u00f3n en primer lugar, la importaci\u00f3n de ficheros planos. El proceso de transformaci\u00f3n de estos datos consiste en copiar los datos del cliente (nombre, correo electr\u00f3nico, tel\u00e9fono, nombre de la empresa) en un nuevo documento. A continuaci\u00f3n, los datos de la direcci\u00f3n deben copiarse en subdocumentos para las direcciones de facturaci\u00f3n y postal. Como s\u00f3lo tenemos una direcci\u00f3n por cliente, copiaremos esta direcci\u00f3n tanto en el subdocumento de facturaci\u00f3n como en el de direcci\u00f3n postal:<\/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 las tablas<\/span><\/h2>\n<p><span style=\"font-weight: 400\">El c\u00f3digo Eventing para lograr esto es bastante simple:<\/span><\/p>\n<pre class=\"nums:false nums-toggle:false decode-attributes:false lang:js decode:true\"> \u00a01 function OnUpdate(doc, meta) {\r\n  2 const nuevo_doc = {}; \/\/ Nuevo documento de cliente\r\n  3 const direcci\u00f3n = {}; \/\/ Nuevo documento de direcci\u00f3n\r\n  4\r\n  5 nuevo_doc['nombre'] = doc.nombre;\r\n  6 nuevo_doc['apellido'] = doc.apellido;\r\n  7 new_doc['email'] = doc.email;\r\n  8 nuevo_doc['tel\u00e9fono'] = doc.tel\u00e9fono;\r\n  9 nuevo_doc['nombre_empresa'] = doc.nombre_empresa;\r\n 10\r\n 11 direcci\u00f3n['direcci\u00f3n_calle_1'] = doc.direcci\u00f3n_calle_1;\r\n 12 direcci\u00f3n['direcci\u00f3n_calle_2'] = doc.direcci\u00f3n_calle_2;\r\n 13 direcci\u00f3n['ciudad'] = doc.ciudad;\r\n 14 direcci\u00f3n['provincia'] = doc.provincia;\r\n 15 direcci\u00f3n['c\u00f3digo_postal'] = doc.c\u00f3digo_postal;\r\n 16\r\n 17 \/\/ A\u00f1ade el documento de direcci\u00f3n al documento de cliente como subdocumentos\r\n 18 nuevo_doc['direcci\u00f3n_facturaci\u00f3n'] = direcci\u00f3n;\r\n 19 new_doc['mailing_address'] = direcci\u00f3n;\r\n 20\r\n 21 \/\/ Esto crea el nuevo documento en el bucket de destino\r\n 22 dest_bkt[doc.email] = nuevo_doc;\r\n 23\r\n 24 \/\/ Borra el documento original - descomenta abajo\r\n 25 \/\/ borrar sch2[meta.id];\r\n 26\r\n 27 log(\"Documento creado\/actualizado\", meta.id);\r\n 28 }<\/pre>\n<p><span style=\"font-weight: 400\">El c\u00f3digo anterior deber\u00eda ser lo suficientemente f\u00e1cil de entender, incluso para los codificadores no JavaScript, pero voy a romper esto por secci\u00f3n s\u00f3lo para estar seguro.<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><span style=\"font-weight: 400\"><em>L\u00ednea 1<\/em> se ejecuta cada vez que se muta (crea o modifica) un documento del bucket de origen. A continuaci\u00f3n veremos c\u00f3mo definimos el bucket de origen.<\/span><\/li>\n<li><span style=\"font-weight: 400\">Las l\u00edneas 2-3 crean objetos JavaScript para contener el nuevo documento de cliente y el documento de direcci\u00f3n que se utilizar\u00e1n como subdocumentos dentro del documento de cliente.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>L\u00edneas 5-15<\/em> copiar las propiedades del documento original en los objetos cliente y direcci\u00f3n.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>L\u00edneas 18 y 19<\/em> asignar el documento de direcci\u00f3n como subdocumentos de cliente para las propiedades de direcci\u00f3n postal y de facturaci\u00f3n.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>L\u00ednea 22<\/em> crea el documento en el bucket de destino de Couchbase. A continuaci\u00f3n veremos c\u00f3mo definimos el bucket de destino.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>Por \u00faltimo, la l\u00ednea 25<\/em> borrar\u00e1 el documento original, aunque aqu\u00ed est\u00e1 comentado.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>L\u00ednea 27<\/em> registra la operaci\u00f3n. Es posible que desee comentar \/ eliminar esto despu\u00e9s de la prueba.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Configurar el entorno<\/h2>\n<p><span style=\"font-weight: 400\">Para probar este script, necesitaremos configurar nuestro entorno Couchbase. En primer lugar, necesitaremos un cl\u00faster Couchbase que ejecute el servicio de datos, as\u00ed como el servicio de eventos. Esto puede ser tan peque\u00f1o como un cluster de un solo nodo ejecut\u00e1ndose en Docker, o un cluster m\u00e1s grande de m\u00faltiples nodos ejecut\u00e1ndose en Capella.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Una vez que tengamos el cl\u00faster en funcionamiento, tendremos que crear los buckets para importar datos y un bucket de destino final. El servicio de eventos tambi\u00e9n requiere un bucket de metadatos. Cree los siguientes cuatro buckets, cada uno con la cuota m\u00ednima requerida de 100mb:<\/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\">Tambi\u00e9n recomiendo activar <em>descarga<\/em> para este ejercicio.<\/span><\/p>\n<h3>Creaci\u00f3n de una funci\u00f3n de eventos<\/h3>\n<p><span style=\"font-weight: 400\">Ahora tenemos que crear la funci\u00f3n de eventos. Selecciona la funci\u00f3n <strong>concurso<\/strong> y, a continuaci\u00f3n, haga clic en <strong>A\u00f1adir funci\u00f3n<\/strong>. Utilice los siguientes ajustes:<\/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\">A continuaci\u00f3n, haga clic en <strong>Siguiente A\u00f1adir c\u00f3digo<\/strong>\u00a0y sustituir el valor por defecto <em>OnUpdate<\/em> con el c\u00f3digo anterior. Haga clic en <strong>Guardar<\/strong> <strong>y Retorno<\/strong>. En este punto el c\u00f3digo ha sido almacenado, pero la funci\u00f3n necesita ser desplegada para que comience a procesar datos. Haz clic en el nombre de la funci\u00f3n para abrir su configuraci\u00f3n y despliega la funci\u00f3n ahora.<\/span><\/p>\n<h3>Creaci\u00f3n de documentos JSON de prueba<\/h3>\n<p><span style=\"font-weight: 400\">Ahora vamos a probarlo creando un documento en el directorio <em>esquema2<\/em> cubo. A\u00f1ada un documento utilizando <\/span><em><span style=\"font-weight: 400\">wile.e.coyote@acmecorp.com<\/span><\/em><span style=\"font-weight: 400\">\u00a0como clave del documento, y con el siguiente cuerpo del documento:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n  \"customer_id\": null,\r\n  \"first_name\": \"Wile\",\r\n  \"middle_name\": \"E\",\r\n  \"last_name\": \"Coyote\",\r\n  \"email\": \"wile.e.coyote@acmecorp.com\",\r\n  \"t\u00edtulo\": \"Genio\",\r\n  \"company_name\": \"Acme Corporation\",\r\n  \"phone\": \"123-555-1212\",\r\n  \"street_address_1\": \"694 York Circle\",\r\n  \"street_address_2\": \"\",\r\n  \"city\": \"Hackettstown\",\r\n  \"province\": \"NJ\",\r\n  \"c\u00f3digo_postal\": \"07840\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400\">En un momento, deber\u00edas ver que las estad\u00edsticas del evento indican \u00e9xito:<\/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\">Ahora mira en el <em>cliente<\/em> y ver\u00e1 que el documento anterior se ha transformado. Observe c\u00f3mo la direcci\u00f3n existe ahora como subdocumentos dentro de las propiedades <em>direcci\u00f3n_facturaci\u00f3n<\/em>\u00a0y <em>direcci\u00f3n postal<\/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>Transformaci\u00f3n en subdocumentos<\/h2>\n<p><span style=\"font-weight: 400\">Ahora abordemos la transformaci\u00f3n m\u00e1s compleja del esquema. La migraci\u00f3n de la estructura relacional para que coincida con nuestra estructura de subdocumentos se parece a esto:<\/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\">Tendremos que desnormalizar las tablas de direcciones y c\u00f3digos postales en un \u00fanico subdocumento, uno para las direcciones de env\u00edo y otro para las de facturaci\u00f3n. En este caso, los datos de las tres tablas se almacenan en colecciones dentro del bucket.\u00a0<\/span><\/p>\n<h2><span style=\"font-weight: 400\">C\u00f3digo JavaScript para la desnormalizaci\u00f3n<\/span><\/h2>\n<pre class=\"nums:false nums-toggle:false decode-attributes:false lang:js decode:true\"> \u00a01 function OnUpdate(doc, meta) {\r\n  2 let nuevo_doc = {};\r\n  3 let bill_addr = {};\r\n  4 let mail_addr = {};\r\n  5\r\n  6 nuevo_doc['nombre'] = doc.nombre;\r\n  7 nuevo_doc['apellido'] = doc.apellido;\r\n  8 nuevo_doc['email'] = doc.email;\r\n  9 nuevo_doc['tel\u00e9fono'] = doc.tel\u00e9fono;\r\n 10 nuevo_doc['nombre_empresa'] = doc.nombre_empresa;\r\n 11\r\n 12 bill_addr = bkt_addr[doc.billing_address_id];\r\n 13 mail_addr = bkt_addr[doc.shipping_address_id];\r\n 14\r\n 15 bill_addr['city'] = bkt_pc[bkt_addr[doc.billing_address_id].postal_code].city;\r\n 16 mail_addr['city'] = bkt_pc[bkt_addr[doc.shipping_address_id].postal_code].city;\r\n 17\r\n 18 bill_addr['state'] = bkt_pc[bkt_addr[doc.billing_address_id].postal_code].province;\r\n 19 mail_addr['state'] = bkt_pc[bkt_addr[doc.shipping_address_id].postal_code].province;\r\n 20\r\n 21 new_doc['billing_address'] = bill_addr;\r\n 22 new_doc['mailing_address'] = mail_addr;\r\n 23\r\n 24 log(nuevo_doc);\r\n 25\r\n 26 dest_bkt[doc.email] = nuevo_doc;\r\n 27\r\n 28 \/\/ Borrar cliente existente (dejar direcci\u00f3n\/c\u00f3digo_postal para otros clientes que lo compartan)\r\n 29 \/\/ borrar bkt_cust[meta.id];\r\n 30 log(\"Doc creado\/actualizado\", meta.id);\r\n 31 }<\/pre>\n<p><span style=\"font-weight: 400\">Desglosaremos este c\u00f3digo de nuevo como antes.<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><span style=\"font-weight: 400\"><em>L\u00edneas 2-4<\/em> crear objetos JavaScript para almacenar el nuevo documento, as\u00ed como los subdocumentos para las direcciones de correo y facturaci\u00f3n.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>L\u00edneas 6-10<\/em> copia las propiedades del contacto en el nuevo documento.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>L\u00edneas 12 y 13<\/em> copia los datos de la direcci\u00f3n desde la colecci\u00f3n de direcciones utilizando la clave de documento almacenada en la propiedad address_id del contacto.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>L\u00edneas 15-19<\/em> extrae los datos de ciudad y provincia de la colecci\u00f3n de provincias, utilizando el provincial_id del documento de direcci\u00f3n como clave del documento.<\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>L\u00edneas 21 y 22<\/em> a continuaci\u00f3n, adjunte estos objetos de documento como subdocumentos al nuevo documento de contacto.<\/span><\/li>\n<li><span style=\"font-weight: 400\">Por fin, <em>l\u00ednea 26<\/em> escribe el nuevo documento en el bucket de destino. <\/span><\/li>\n<li><span style=\"font-weight: 400\"><em>L\u00ednea 29<\/em>si no se comenta, se eliminar\u00e1 el documento de contacto original del bucket de origen. Ten en cuenta que no queremos eliminar tambi\u00e9n los documentos de direcci\u00f3n y provincia asociados porque pueden ser utilizados por otros contactos.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Creaci\u00f3n de la funci\u00f3n eventing para la desnormalizaci\u00f3n<\/h2>\n<p><span style=\"font-weight: 400\">Cree esta funci\u00f3n de eventos utilizando la siguiente configuraci\u00f3n y pegue el c\u00f3digo anterior para reemplazar la funci\u00f3n <em>OnUpdate<\/em> funci\u00f3n. Cuando haya terminado, siga adelante y despliegue la funci\u00f3n.<\/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 probar esta funci\u00f3n, tendremos que crear colecciones en el directorio <em>esquema1<\/em> (utilice el bot\u00f3n <em>por defecto<\/em> scope) con los nombres: <em>direcciones<\/em>, <em>clientes<\/em>, <em>c\u00f3digos postales<\/em>. A continuaci\u00f3n, cree los siguientes documentos (en este orden, de lo contrario fallar\u00e1n las b\u00fasquedas en la funci\u00f3n):<\/span><\/p>\n<p><span style=\"font-weight: 400\"><em>C\u00f3digos postales<\/em> con ID de documento <\/span><span style=\"font-weight: 400\"><em>43062<\/em>:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n  \"c\u00f3digo_postal\": \"43062\",\r\n  \"city\": \"Pataskala\",\r\n  \"province\": \"OH\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400\"><em>C\u00f3digos postales<\/em> con ID de documento <\/span><span style=\"font-weight: 400\"><em>23228<\/em>:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n  \"c\u00f3digo_postal\": \"23228\",\r\n  \"city\": \"Henrico\",\r\n  \"province\": \"VA\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400\"><em>Direcciones<\/em> con ID de documento <em>000071<\/em>:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n  \"address_id\": \"000071\",\r\n  \"street_address_1\": \"85 Hartford Road\",\r\n  \"street_address_2\": \"\",\r\n  \"postal_code\": \"23228\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400\"><em>Direcciones<\/em> con ID de documento <em>000086<\/em>:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">{\r\n  \"address_id\": \"000086\",\r\n  \"street_address_1\": \"460 Broad Dr.\",\r\n  \"street_address_2\": \"\",\r\n  \"postal_code\": \"43062\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400\">Por \u00faltimo, en el <em>clientes<\/em> con ID de 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  \"customer_id\": null,\r\n  \"first_name\": \"Thomas\",\r\n  \"middle_name\": null,\r\n  \"apellido\": \"Dolby\",\r\n  \"email\": \"blinded_by@science.com\",\r\n  \"t\u00edtulo\": null,\r\n  \"phone\": \"867-5309\",\r\n  \"billing_address_id\": \"000086\",\r\n  \"shipping_address_id\": \"000071\",\r\n  \"company_name\": \"The Golden Age of Wireless\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400\">R\u00e1pidamente deber\u00eda ver que las estad\u00edsticas de esta funci\u00f3n muestran el \u00e9xito:<\/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\">Y si miras el documento en el bucket de clientes, deber\u00edas ver la siguiente transformaci\u00f3n con las dos direcciones desnormalizadas en 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>Reflexiones finales<\/h2>\n<p><span style=\"font-weight: 400\">Este es un ejemplo muy simplista. En un entorno de producci\u00f3n, es probable que agregue c\u00f3digo para manejar excepciones.\u00a0\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Tambi\u00e9n puede aumentar el n\u00famero de trabajadores de 1 al n\u00famero de vCPUs si tiene un gran conjunto de datos y requiere un mayor rendimiento<\/span><span style=\"font-weight: 400\">.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Las funciones de eventing utilizadas en este blog pueden encontrarse en el siguiente repositorio de 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\">. En este repositorio tambi\u00e9n hay un par de scripts (tanto de Bash como de Python) que se pueden utilizar para crear un cl\u00faster de un solo nodo con las funciones de eventos y los conjuntos de datos de muestra m\u00e1s grandes precargados.<\/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\">Descargar:<\/span><\/i><a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/?ref=blog\"><span style=\"font-weight: 400\"> Descargar 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>Referencias<\/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\">Documentaci\u00f3n sobre eventos de Couchbase<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/www.couchbase.com\/blog\/es\/whats-new-in-couchbase-server-7-1\/\"><span style=\"font-weight: 400\">Novedades: Couchbase Server 7.1<\/span><\/a><\/li>\n<li style=\"font-weight: 400\"><a href=\"https:\/\/www.couchbase.com\/blog\/es\/tag\/eventing\/?ref=blog\"><span style=\"font-weight: 400\">Otros blogs de Couchbase sobre Eventing<\/span><\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Una de las muchas ventajas de usar una base de datos basada en documentos como Couchbase es la capacidad de usar un modelo de datos flexible para almacenar datos sin las restricciones de un esquema r\u00edgido y predeterminado. Muchos clientes eligen una base de datos NoSQL para [...]<\/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\/es\/eventing-data-consolidation-in-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\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\/es\/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\":\"es\",\"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\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\",\"@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\/es\/author\/danieljames\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Uso del servicio de eventos para consolidar datos de varias fuentes","description":"Las funciones de eventos de Couchbase se pueden utilizar para ayudar a consolidar datos de diferentes fuentes\/modelos de datos, aqu\u00ed desnormalizamos tablas sobre la marcha.","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\/es\/eventing-data-consolidation-in-couchbase\/","og_locale":"es_MX","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\/es\/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":"es","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":"Uso del servicio de eventos para consolidar datos de varias fuentes","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":"Las funciones de eventos de Couchbase se pueden utilizar para ayudar a consolidar datos de diferentes fuentes\/modelos de datos, aqu\u00ed desnormalizamos tablas sobre la marcha.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/eventing-data-consolidation-in-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"es","@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":"El blog de Couchbase","description":"Couchbase, la base de datos 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":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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":"es","@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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/13533","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/69851"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=13533"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/13533\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13547"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=13533"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=13533"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=13533"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=13533"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}