{"id":6290,"date":"2019-01-21T13:46:34","date_gmt":"2019-01-21T21:46:34","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=6290"},"modified":"2025-06-13T22:39:33","modified_gmt":"2025-06-14T05:39:33","slug":"real-time-user-deduplication-couchbase-eventing","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/real-time-user-deduplication-couchbase-eventing\/","title":{"rendered":"Deduplicaci\u00f3n de usuarios en tiempo real con Couchbase Eventing"},"content":{"rendered":"<div class=\"paragraph\">\n<p>La deduplicaci\u00f3n de usuarios es una actividad importante para cualquiera que gestione un corpus de datos relacionados con usuarios. En algunos casos, es posible que la base de datos contenga varias versiones de un mismo usuario. Esto puede ocurrir por varias razones: mala gesti\u00f3n de los datos, datos de usuario no coincidentes, error del usuario o del sistema, etc. Tambi\u00e9n es frecuente la agregaci\u00f3n de informaci\u00f3n de usuarios procedente de muchos sistemas diferentes. Es posible que disponga de su conjunto de datos de usuarios principal, pero que desee enriquecerlo con datos de terceros, como redes sociales, sistemas de venta de entradas o de registro, o incluso con informaci\u00f3n adicional de usuarios procedente de otros silos de su propia organizaci\u00f3n.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/01\/11801-headshot-andy-deduplication.jpg\" alt=\"11801 headshot andy deduplication\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><em>Este art\u00edculo ha sido escrito por Andy Kruth. Andy Kruth es Consultor Principal en <a href=\"https:\/\/www.linkedin.com\/company\/avalon-consulting-llc\">Avalon Consulting, LLC<\/a> donde se centra en la arquitectura y el desarrollo de sistemas Big Data y soluciones NoSQL. Este post fue influenciado por el trabajo realizado para The Cincinnati Reds. Aunque el siguiente ejemplo puede parecer simple, se basa en una aplicaci\u00f3n mucho m\u00e1s compleja creada para los Reds en la que los datos de usuario de varias facetas del negocio de los Reds se deduplicaron en un \u00fanico conjunto de datos de cuentas y hogares.<\/em><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Sea cual sea el caso, la deduplicaci\u00f3n de la informaci\u00f3n de los usuarios en un conjunto de datos conciso y preciso es una actividad habitual. Un enfoque tradicional para lograr esto es simplemente ejecutar toda la informaci\u00f3n de usuario a trav\u00e9s de una aplicaci\u00f3n para que coincida con los registros sobre la base de la heur\u00edstica definida y escupir un \u00fanico conjunto de datos. Aunque esto \"funciona\", a menudo se trata de una acci\u00f3n que hay que realizar por lotes de forma regular, o al menos de forma regular en funci\u00f3n de los deltas que se puedan capturar. Pero el inconveniente de este enfoque es que siempre que se utilizan acciones por lotes o programadas existe un gran potencial de que los datos resultantes sean obsoletos.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Con la introducci\u00f3n de <a href=\"https:\/\/www.couchbase.com\/blog\/es\/eventing\/\">Eventos de Couchbase<\/a>ahora tiene una nueva opci\u00f3n para una deduplicaci\u00f3n eficaz, \u00a1y es en tiempo real! Me abstendr\u00e9 de la informaci\u00f3n general sobre Eventing que ya se ha tratado a fondo en otras publicaciones (v\u00e9ase <a href=\"https:\/\/www.couchbase.com\/blog\/es\/eventing\/\">aqu\u00ed<\/a>y <a href=\"https:\/\/www.couchbase.com\/blog\/es\/eventing-best-practices\/\">aqu\u00ed<\/a>y <a href=\"https:\/\/www.couchbase.com\/blog\/es\/eventing-notification-couchbase-functions\/\">aqu\u00ed<\/a>). En su lugar, este post se centrar\u00e1 en un ejemplo sencillo de c\u00f3mo puedes desarrollar un motor de deduplicaci\u00f3n en tiempo real usando Couchbase Eventing. Empecemos.<\/p>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_the_bucket_setup\">La configuraci\u00f3n del cubo<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Para esta demostraci\u00f3n necesitar\u00e1s un total de 4 cubos:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>metadata - este es su cubo de metadatos obligatorio que contiene toda la informaci\u00f3n para ejecutar sus Funciones de Eventos.<\/li>\n<li>staging - este bucket actuar\u00e1 como zona de aterrizaje para todos sus datos de usuario.<\/li>\n<li>fieldindex - este bucket va a actuar como \u00edndice de la informaci\u00f3n de campo que necesitamos para emparejar a los usuarios<\/li>\n<li>usuarios - este cubo es nuestro producto final: un conciso conjunto de datos de usuarios<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_the_function_setup\">Configuraci\u00f3n de funciones<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Cuando creemos nuestra funci\u00f3n de deduplicaci\u00f3n (yo llam\u00e9 a la m\u00eda \"dedupe\"), apunta el bucket de metadatos a \"metadata\" y el bucket de origen a \"staging\". Tambi\u00e9n tendr\u00e1s que definir dos alias: \"users\" que puede apuntar al bucket de usuarios y \"fieldindex\" que puede apuntar al bucket de fieldindex.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_the_function_code\">El c\u00f3digo de funci\u00f3n<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Para esta demostraci\u00f3n consideraremos un escenario de deduplicaci\u00f3n muy simple: Queremos una lista concisa de usuarios basada en su direcci\u00f3n de correo electr\u00f3nico y, para cada usuario, una lista de todos los documentos originales que contengan ese correo electr\u00f3nico con fines de auditor\u00eda posterior.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Para este ejemplo trabajaremos con documentos muy sencillos. Aqu\u00ed tienes uno para que te hagas una idea:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">\"test::1\" {\r\n\t\"email\": \"abc@abc.com\"\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>El c\u00f3digo de funci\u00f3n completo es el siguiente<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">function OnUpdate(doc, meta) {\r\n    var email = getEmailFromDoc(doc)\r\n\r\n    if (email != null) {\r\n        var user = getUserFromEmail(email)\r\n        var userDoc = {}\r\n\r\n        if (user != null) {\r\n            userDoc = users[user]\r\n            userDoc.matches = userDoc.matches.concat([meta.id])\r\n        } else {\r\n            userDoc = doc\r\n            userDoc.userid = meta.id\r\n            userDoc.created = Date.now()\r\n            userDoc.matches = [meta.id]\r\n        }\r\n\r\n        users[userDoc.userid] = userDoc\r\n        addEmailToFieldIndex(email, userDoc.userid)\r\n    } else {\r\n        \/\/ doc does not have an email and is not valid for deduplication\r\n    }\r\n}\r\n\r\nfunction getEmailFromDoc(doc) {\r\n    for (var key in doc) {\r\n        var field = key.toLowerCase()\r\n\r\n        if (field.includes(\"email\")) {\r\n            return doc[key]\r\n        }\r\n    }\r\n\r\n    return null\r\n}\r\n\r\nfunction getUserFromEmail(email) {\r\n    try {\r\n        return fieldindex[\"email::\" + email].userid\r\n    } catch (e) {\r\n        \/\/ user was not found, let's just return null\r\n    }\r\n\r\n    return null\r\n}\r\n\r\nfunction addEmailToFieldIndex(email, user) {\r\n    fieldindex[\"email::\" + email] = {\"userid\": user}\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_parsing_the_document\">An\u00e1lisis del documento<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Comenzamos en la funci\u00f3n OnUpdate(doc, meta). Esta funci\u00f3n es invocada cada vez que se produce una mutaci\u00f3n en los documentos del staging bucket, es decir, cada vez que se a\u00f1ade o actualiza uno de nuestros documentos en bruto. El primer paso es determinar la direcci\u00f3n de correo electr\u00f3nico del documento entrante. Para ello, tenemos una peque\u00f1a funci\u00f3n de ayuda: getEmailFromDoc(doc). Esta funci\u00f3n simplemente itera a trav\u00e9s de todos los nombres de campo del documento en busca de uno que contenga la cadena \"email\", entonces devolvemos ese valor. En esta funci\u00f3n tambi\u00e9n puedes optar por buscar nombres de campo espec\u00edficos. Debe tener en cuenta que si tiene varias fuentes de datos aqu\u00ed, cada fuente puede utilizar diferentes nombres de campo, por lo que un enfoque generalizado anterior puede funcionar para usted.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_finding_a_match\">Encontrar una coincidencia<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Con la direcci\u00f3n de correo electr\u00f3nico en la mano, es hora de seguir adelante. Si no tenemos una direcci\u00f3n de correo electr\u00f3nico simplemente descartaremos el documento en este ejemplo. Asumiendo que hemos obtenido con \u00e9xito una direcci\u00f3n de correo electr\u00f3nico el siguiente paso es recuperar nuestro usuario can\u00f3nico del bucket \"users\" si ese usuario ya existe. Para ello tenemos una segunda funci\u00f3n de ayuda: getUserFromEmail(email). Esta funci\u00f3n utiliza nuestro bucket \"fieldindex\" que simplemente utilizaremos como valor clave para buscar correos electr\u00f3nicos. Buscamos en el bucket \"fieldindex\" un documento que coincida con nuestro correo electr\u00f3nico. Observar\u00e1 que anteponemos un tipo de dato a las claves de \"fieldindex\", lo que le permitir\u00e1 a\u00f1adir m\u00e1s tipos de datos m\u00e1s adelante sin confundirse. Si encontramos el email en \"fieldindex\" entonces devolvemos el userid asociado, en caso contrario simplemente null.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_deduplication\">Deduplicaci\u00f3n<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>De vuelta en la funci\u00f3n OnUpdate, si tenemos \u00e9xito en encontrar un userid existente, entonces recuperamos ese usuario existente del bucket \"users\" y simplemente a\u00f1adimos el meta.id de nuestros documentos actuales a la lista de documentos coincidentes. Si no encontramos un userid existente, entonces tenemos que crear un nuevo usuario. Para ello, simplemente empezamos con el documento original y a\u00f1adimos algunos campos, incluyendo una fecha de creaci\u00f3n y el inicio de un campo de coincidencias que contendr\u00e1 una lista de documentos que coincidan con el correo electr\u00f3nico de este usuario.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Despu\u00e9s de obtener o crear un nuevo documento de usuario almacenamos ese documento en el bucket \"usuarios\". Necesitamos un meta.id para almacenar el usuario. En este ejemplo estamos utilizando simplemente el meta.id del documento original que genera este usuario, pero usted puede elegir otra cosa, depende de usted. Si el usuario ya exist\u00eda, simplemente se sobrescribir\u00e1.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_indexing_the_user\">Indexaci\u00f3n del usuario<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Por \u00faltimo, tenemos que actualizar nuestro cubo \"fieldindex\" para que los futuros documentos con esta direcci\u00f3n de correo electr\u00f3nico puedan identificarse correctamente. Para ello utilizaremos nuestra \u00faltima funci\u00f3n de ayuda: addEmailToFieldIndex(email, user). Esta funci\u00f3n simplemente escribe el email dado como clave y el userid dado como cuerpo del documento en el bucket \"fieldindex\".<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>\u00a1Y ya est\u00e1! <strong>En s\u00f3lo 50 l\u00edneas de c\u00f3digo tienes los inicios de un motor de deduplicaci\u00f3n de usuarios en tiempo real.<\/strong> Vamos a probarlo.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_testing_the_function\">Probar la funci\u00f3n<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Despu\u00e9s de desplegar esta funci\u00f3n, podemos probarla creando algunos documentos en nuestro bucket \"staging\".<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Primero vamos a crear un usuario base. Crear un nuevo documento en el cubo \"staging\" que se parece a esto:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">\"test::1\" {\r\n\t\"email\": \"abc@abc.com\"\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Deber\u00edas poder ver los efectos inmediatos en los buckets \"fieldindex\" y \"users\". En \"fieldindex\" tenemos nuestro documento clave\/valor creado:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">email::abc@abc.com {\r\n\t\"userid\":\"test::1\"\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>F\u00edjate que es simplemente el email apuntando a un userid que en este caso es el meta.id de nuestro primer documento original: test::1.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>A continuaci\u00f3n, mira el cubo \"usuarios\". Aqu\u00ed tenemos el nuevo usuario que se ha creado:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">test::1 {\r\n\t\"email\":\"abc@abc.com\",\r\n\t\"userid\":\"test::1\",\r\n\t\"created\":1546531965825,\r\n\t\"matches\":[\"test::1\"]\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Observe que tenemos la direcci\u00f3n de correo electr\u00f3nico original, as\u00ed como algunos campos adicionales, incluida una lista completa de documentos coincidentes (que en este momento es s\u00f3lo nuestro primer documento).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Vamos a a\u00f1adir algunos documentos m\u00e1s para probar nuestros casos extremos. A\u00f1ade los dos documentos siguientes al bucket \"staging\":<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">test::2 {\r\n\t\"name\":\"Tavi\"\r\n}\r\n\r\ntest::3 {\r\n\t\"useremail\":\"abc@abc.com\"\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>El documento test::2 no tiene un campo de correo electr\u00f3nico y s\u00f3lo sirve para comprobar que no tenemos en cuenta los documentos que no tienen correo electr\u00f3nico.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>El documento test::3 comprueba un par de cosas. En primer lugar, el campo de correo electr\u00f3nico se llama \"useremail\", pero esto deber\u00eda detectarse sin problemas debido a nuestra forma general de encontrar campos de correo electr\u00f3nico. En segundo lugar, \u00a1tiene un correo electr\u00f3nico que coincide! Comprobemos nuestro cubo \"usuarios\" y veamos c\u00f3mo han ido las cosas. Seguimos teniendo un solo usuario, pero el documento es ligeramente diferente:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">test::1 {\r\n\t\"email\":\"abc@abc.com\",\r\n\t\"userid\":\"test::1\",\r\n\t\"created\":1546531965825,\r\n\t\"matches\":[\"test::1\", \"test::3\"]\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Observe que la \u00fanica diferencia es que ahora tenemos una referencia al documento test::3 en nuestro campo matches. \u00a1Hurra! Hemos deduplicado con \u00e9xito esos documentos.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_conclusion\">Conclusi\u00f3n<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Como se muestra arriba el nuevo sistema de Eventing de Couchbase puede ser usado para crear un motor de deduplicaci\u00f3n de usuarios en tiempo real. Aunque este ejemplo fue extremadamente simplificado, javascript (el lenguaje elegido para las funciones de Eventing) es extremadamente vers\u00e1til y puedes hacer casi cualquier cosa que quieras.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Un motor de deduplicaci\u00f3n m\u00e1s funcional puede tener en cuenta muchos m\u00e1s campos que s\u00f3lo los correos electr\u00f3nicos de los usuarios. Puede utilizar una heur\u00edstica mucho m\u00e1s compleja para emparejar documentos. Incluso puede considerar un segundo nivel de emparejamiento donde agrupa usuarios espec\u00edficos en Hogares basados en su informaci\u00f3n de identificaci\u00f3n. Todo esto depende de ti, pero con Couchbase Eventing la deduplicaci\u00f3n en tiempo real se hace f\u00e1cil.<\/p>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>User deduplication is an important activity for anyone managing a corpus of user related data. In some cases you may end up with multiple versions of the same user in your database. This can happen for any number of reasons: [&hellip;]<\/p>","protected":false},"author":71,"featured_media":6291,"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":[1543],"ppma_author":[8937],"class_list":["post-6290","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-eventing","category-javascript","tag-javascript"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Real Time User Deduplication with Couchbase Eventing<\/title>\n<meta name=\"description\" content=\"User deduplication is an important activity for anyone managing user related data. Couchbase Eventing is a new option for effective deduplication.\" \/>\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\/real-time-user-deduplication-couchbase-eventing\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Real Time User Deduplication with Couchbase Eventing\" \/>\n<meta property=\"og:description\" content=\"User deduplication is an important activity for anyone managing user related data. Couchbase Eventing is a new option for effective deduplication.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/real-time-user-deduplication-couchbase-eventing\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-01-21T21:46:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T05:39:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/01\/118-hero-deduplication.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"600\" \/>\n\t<meta property=\"og:image:height\" content=\"209\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Matthew Groves\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mgroves\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthew Groves\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"Real Time User Deduplication with Couchbase Eventing\",\"datePublished\":\"2019-01-21T21:46:34+00:00\",\"dateModified\":\"2025-06-14T05:39:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/\"},\"wordCount\":1463,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/01\/118-hero-deduplication.jpg\",\"keywords\":[\"javascript\"],\"articleSection\":[\"Couchbase Server\",\"Eventing\",\"JavaScript\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/\",\"name\":\"Real Time User Deduplication with Couchbase Eventing\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/01\/118-hero-deduplication.jpg\",\"datePublished\":\"2019-01-21T21:46:34+00:00\",\"dateModified\":\"2025-06-14T05:39:33+00:00\",\"description\":\"User deduplication is an important activity for anyone managing user related data. Couchbase Eventing is a new option for effective deduplication.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/01\/118-hero-deduplication.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/01\/118-hero-deduplication.jpg\",\"width\":600,\"height\":209,\"caption\":\"Pete Rose Baseballs by David Berkowitz - licensed through Creative Commons - https:\/\/www.flickr.com\/photos\/davidberkowitz\/6006921869\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Real Time User Deduplication with Couchbase Eventing\"}]},{\"@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\/3929663e372020321b0152dc4fa65a58\",\"name\":\"Matthew Groves\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"caption\":\"Matthew Groves\"},\"description\":\"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.\",\"sameAs\":[\"https:\/\/crosscuttingconcerns.com\",\"https:\/\/x.com\/mgroves\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/matthew-groves\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Deduplicaci\u00f3n de usuarios en tiempo real con Couchbase Eventing","description":"User deduplication is an important activity for anyone managing user related data. Couchbase Eventing is a new option for effective deduplication.","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\/real-time-user-deduplication-couchbase-eventing\/","og_locale":"es_MX","og_type":"article","og_title":"Real Time User Deduplication with Couchbase Eventing","og_description":"User deduplication is an important activity for anyone managing user related data. Couchbase Eventing is a new option for effective deduplication.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/real-time-user-deduplication-couchbase-eventing\/","og_site_name":"The Couchbase Blog","article_published_time":"2019-01-21T21:46:34+00:00","article_modified_time":"2025-06-14T05:39:33+00:00","og_image":[{"width":600,"height":209,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/01\/118-hero-deduplication.jpg","type":"image\/jpeg"}],"author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"Real Time User Deduplication with Couchbase Eventing","datePublished":"2019-01-21T21:46:34+00:00","dateModified":"2025-06-14T05:39:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/"},"wordCount":1463,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/01\/118-hero-deduplication.jpg","keywords":["javascript"],"articleSection":["Couchbase Server","Eventing","JavaScript"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/","url":"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/","name":"Deduplicaci\u00f3n de usuarios en tiempo real con Couchbase Eventing","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/01\/118-hero-deduplication.jpg","datePublished":"2019-01-21T21:46:34+00:00","dateModified":"2025-06-14T05:39:33+00:00","description":"User deduplication is an important activity for anyone managing user related data. Couchbase Eventing is a new option for effective deduplication.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/01\/118-hero-deduplication.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/01\/118-hero-deduplication.jpg","width":600,"height":209,"caption":"Pete Rose Baseballs by David Berkowitz - licensed through Creative Commons - https:\/\/www.flickr.com\/photos\/davidberkowitz\/6006921869"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/real-time-user-deduplication-couchbase-eventing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Real Time User Deduplication with Couchbase Eventing"}]},{"@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\/3929663e372020321b0152dc4fa65a58","name":"Matthew Groves","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54","url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","caption":"Matthew Groves"},"description":"A Matthew D. Groves le encanta programar. No importa si se trata de C#, jQuery o PHP: enviar\u00e1 pull requests para cualquier cosa. Lleva codificando profesionalmente desde que escribi\u00f3 una aplicaci\u00f3n de punto de venta en QuickBASIC para la pizzer\u00eda de sus padres, all\u00e1 por los a\u00f1os noventa. Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores. Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/matthew-groves\/"}]}},"authors":[{"term_id":8937,"user_id":71,"is_guest":0,"slug":"matthew-groves","display_name":"Matthew Groves","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","first_name":"Matthew","last_name":"Groves","user_url":"https:\/\/crosscuttingconcerns.com","author_category":"","description":"A Matthew D. Groves le encanta programar.  No importa si se trata de C#, jQuery o PHP: enviar\u00e1 pull requests para cualquier cosa.  Lleva codificando profesionalmente desde que escribi\u00f3 una aplicaci\u00f3n de punto de venta en QuickBASIC para la pizzer\u00eda de sus padres, all\u00e1 por los a\u00f1os noventa.  Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores.  Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/6290","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\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=6290"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/6290\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/6291"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=6290"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=6290"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=6290"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=6290"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}