{"id":5642,"date":"2018-08-22T12:22:45","date_gmt":"2018-08-22T19:22:45","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5642"},"modified":"2025-06-13T21:23:09","modified_gmt":"2025-06-14T04:23:09","slug":"the-couchbase-data-platform-in-action-analytics","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/the-couchbase-data-platform-in-action-analytics\/","title":{"rendered":"La plataforma de datos Couchbase en acci\u00f3n: An\u00e1lisis"},"content":{"rendered":"<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p><span class=\"image\"><a class=\"image\" title=\"https:\/\/www.couchbase.com\/downloads\/\" href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\"><img decoding=\"async\" src=\"https:\/\/img.shields.io\/badge\/Couchbase-v6.0.0%20beta-red.svg\" alt=\"Couchbase v6.0.0%20beta red\" \/><\/a><\/span><\/p>\n<\/div>\n<div id=\"toc\" class=\"toc\">\n<div id=\"toctitle\" class=\"title\">Contenido<\/div>\n<ul class=\"sectlevel1\">\n<li><a title=\"\" href=\"#_what_is_cbas_and_how_does_it_compare_to_standard_couchbase\">\u00bfQu\u00e9 es CBAS y c\u00f3mo se compara con Couchbase \"est\u00e1ndar\"?<\/a><\/li>\n<li><a title=\"\" href=\"#_example_data_and_configuration\">Ejemplo de datos y configuraci\u00f3n<\/a><\/li>\n<li><a title=\"\" href=\"#_code_and_queries\">C\u00f3digo y consultas<\/a>\n<ul class=\"sectlevel2\">\n<li><a title=\"\" href=\"#_web_client\">Cliente web<\/a><\/li>\n<li><a title=\"\" href=\"#_web_server_and_queries\">Servidor web y consultas<\/a><\/li>\n<li><a title=\"\" href=\"#_querying_with_sql\">Consultas con SQL<\/a><\/li>\n<li><a title=\"\" href=\"#_query_optimization\">Optimizaci\u00f3n de consultas<\/a><\/li>\n<li><a title=\"\" href=\"#_query_results_and_rest_response\">Resultados de la consulta y respuesta REST<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a title=\"\" href=\"#_conclusion\">Conclusi\u00f3n<\/a><\/li>\n<li><a title=\"\" href=\"#_postscript\">Posdata<\/a><\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>Con la publicaci\u00f3n de <a title=\"https:\/\/www.couchbase.com\/nosql-databases\/couchbase-server\" href=\"https:\/\/www.couchbase.com\/blog\/es\/nosql-databases\/couchbase-server\/\">Servidor Couchbase<\/a> <a title=\"https:\/\/www.couchbase.com\/blog\/announcing-couchbase-server-6-0-beta\/\" href=\"https:\/\/www.couchbase.com\/blog\/es\/announcing-couchbase-server-6-0-beta\/\">versi\u00f3n 6.0 Beta<\/a>Couchbase Analytics Service (CBAS) da oficialmente un paso m\u00e1s hacia la disponibilidad general.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Usamos una versi\u00f3n previa para la demostraci\u00f3n t\u00e9cnica de Couchbase Connect Silicon Valley. En este art\u00edculo entraremos en detalles, como el c\u00f3digo y las consultas utilizadas.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Puede ver un v\u00eddeo de la demostraci\u00f3n (remitido a la parte de an\u00e1lisis) aqu\u00ed.<\/p>\n<\/div>\n<div class=\"videoblock\">\n<div class=\"content\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_what_is_cbas_and_how_does_it_compare_to_standard_couchbase\">\u00bfQu\u00e9 es CBAS y c\u00f3mo se compara con Couchbase \"est\u00e1ndar\"?<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Mientras que con una base de datos operativa se suelen realizar consultas optimizadas y predefinidas con \u00edndices de apoyo, CBAS est\u00e1 dise\u00f1ada para ejecutar de forma eficiente consultas complejas, a menudo ad hoc, sobre grandes conjuntos de datos. Al a\u00f1adir CBAS como <a title=\"https:\/\/www.couchbase.com\/multi-dimensional-scalability-overview\" href=\"https:\/\/www.couchbase.com\/blog\/es\/multi-dimensional-scalability-overview\/\">servicio independiente y escalable<\/a>El <a title=\"https:\/\/www.couchbase.com\/\" href=\"https:\/\/www.couchbase.com\/blog\/es\/\">Plataforma de datos Couchbase<\/a> puede realizar una gran cantidad de an\u00e1lisis sin afectar al rendimiento operativo.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Para una introducci\u00f3n en profundidad al servicio Couchbase Analytics, haga clic en este enlace <a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/analytics\/introduction.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/analytics\/introduction.html\">enlace<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_example_data_and_configuration\">Ejemplo de datos y configuraci\u00f3n<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Hemos creado m\u00e1s de 100 millones de documentos de datos m\u00e9dicos sintetizados basados en la <a title=\"https:\/\/www.hl7.org\/fhir\/overview.html\" href=\"https:\/\/www.hl7.org\/fhir\/overview.html\">FHIR<\/a> para su uso en la demostraci\u00f3n. Por supuesto, las implantaciones reales suelen alcanzar los terabytes de datos. El tama\u00f1o de este conjunto nos oblig\u00f3 a enfrentarnos a problemas realistas de optimizaci\u00f3n.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Configurar CBAS para esta aplicaci\u00f3n es bastante sencillo. Encontrar\u00e1 instrucciones completas para configurar la demostraci\u00f3n en <a title=\"https:\/\/www.couchbase.com\/blog\/couchbase-data-platform-action-setup-steps\/\" href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-data-platform-action-setup-steps\/\">esta entrada del blog<\/a> y <a title=\"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-configuring-the-application\/\" href=\"https:\/\/www.couchbase.com\/blog\/es\/the-couchbase-data-platform-in-action-configuring-the-application\/\">este v\u00eddeo<\/a>. Hay un conjunto de datos m\u00e1s peque\u00f1o en la p\u00e1gina <a title=\"https:\/\/github.com\/couchbaselabs\/connect-fall-2017-demo\" href=\"https:\/\/github.com\/couchbaselabs\/connect-fall-2017-demo\">Repo de GitHub<\/a> para el proyecto.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Para la parte anal\u00edtica en concreto, s\u00f3lo tenemos que crear un bucket y designar algunos conjuntos de datos en la sombra. La interoperabilidad se inicia con el \u00faltimo comando \"CONNECT\". Todo ello se ejecuta en el motor de consultas anal\u00edticas. (Tenga en cuenta que <strong>diferente<\/strong> de N1QL. Si utiliza la consola de administraci\u00f3n, debe ejecutarlos en la secci\u00f3n de an\u00e1lisis).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>(<strong>Importante:<\/strong> Estos comandos funcionan a partir de Couchbase 6.0.0 Beta. Para actualizaciones e informaci\u00f3n sobre cambios de \u00faltima hora en otras versiones, consulte\u00a0<a title=\"https:\/\/www.couchbase.com\/blog\/couchbase-analytics-service-changes\/\" href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-analytics-service-changes\/\">Cambios en el servicio Couchbase Analytics<\/a>.)<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code>CREATE DATASET patient ON health WHERE resourceType = \"Patient\"\r\nCREATE DATASET condition ON health WHERE resourceType = \"Condition\"\r\nCREATE DATASET encounter ON health WHERE resourceType = \"Encounter\"\r\nCONNECT LINK Local<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Observe que no hay <a title=\"https:\/\/docs.oracle.com\/cd\/B19306_01\/server.102\/b14223\/ettover.htm\" href=\"https:\/\/docs.oracle.com\/cd\/B19306_01\/server.102\/b14223\/ettover.htm\">ETL<\/a> implicados. Por supuesto, otras preocupaciones empresariales podr\u00edan requerir acondicionar los datos de alguna manera, pero disponer de una plataforma integrada puede ahorrar muchos quebraderos de cabeza en cuanto a herramientas.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_code_and_queries\">C\u00f3digo y consultas<\/h2>\n<div class=\"sectionbody\">\n<div class=\"sect2\">\n<h3 id=\"_web_client\">Cliente web<\/h3>\n<div class=\"paragraph\">\n<p>El c\u00f3digo de la interfaz de usuario est\u00e1 en <code>web\/client\/src\/components\/views\/Analytics.vue<\/code>. Tiene algunos selectores para parametrizar las consultas, y algunos componentes de visualizaci\u00f3n para los resultados.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Visualizamos los datos de dos maneras. Una utiliza un gr\u00e1fico de l\u00edneas para mostrar los valores agregados. (Utilizamos <a title=\"https:\/\/www.chartjs.org\/\" href=\"https:\/\/www.chartjs.org\/\">Gr\u00e1fico.js<\/a> para ello). El gr\u00e1fico es interactivo. Al hacer clic en un punto agregado aparece una tabla con detalles. No vamos a entrar en m\u00e1s detalles aqu\u00ed. La mayor parte del trabajo se realiza en el servidor. La informaci\u00f3n se prepara all\u00ed de forma que el cliente pueda consumirla f\u00e1cilmente.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_web_server_and_queries\">Servidor web y consultas<\/h3>\n<div class=\"paragraph\">\n<p>Los datos se recuperan a trav\u00e9s de puntos finales REST escritos en Node.js. Al igual que con los otros puntos finales REST, el c\u00f3digo del lado del servidor de Node envuelve principalmente consultas a la base de datos.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Hemos optado por organizarlo a trav\u00e9s de cuatro puntos finales: <code>analyticsByAge<\/code>, <code>analyticsByAgeDetails<\/code>, <code>anal\u00edticaSocial<\/code>y <code>analyticsSocialDetails<\/code>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>El c\u00f3digo para una agrupaci\u00f3n (edad, medios sociales) es similar. Echemos un vistazo a <code>analyticsByAge<\/code>. El c\u00f3digo est\u00e1 en <code>web\/servidor\/controllers\/searchController.js<\/code>.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"title\">searchController.js<\/div>\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code data-lang=\"javascript\">var express = require('express');\r\nvar randomHexColor = require('random-hex-color');\r\nvar router = express.Router();\r\n\r\n\/\/ Based on Couchbase colors (TM)\r\nconst palette = [ '#E72731', '#0074e0', '#f0ce0f', '#b26cda', '#00b6bd', '#00a1db', '#eb242a', '#fd9d0d' ];\r\nconst searchKeyAllGenders = 'All Genders';\r\nconst searchKeyAllCities = 'All Cities';\r\n\r\n...\r\n\r\nexports.analyticsByAge = async function(req, res, next) {\r\n  let couchbase = req.app.locals.couchbase;\r\n  let cluster = req.app.locals.cluster;\r\n  let CbasQuery = couchbase.CbasQuery;\r\n  let query = `SELECT year_month, age_group, count(p.id) as patient_count\r\n                 FROM condition c, patient p\r\n                 WHERE substring_after(c.subject.reference, \"uuid:\") \/*+ indexnl *\/ = meta(p).id\r\n                 AND c.code.text = '${req.query.diagnosis}'\r\n                 AND date(c.assertedDate) &gt; date('2007-10-01') `;\r\n\r\n  if (!searchAllGenders(req.query.gender)) {\r\n    query += `AND p.gender = '${req.query.gender.toLowerCase()}' `;\r\n  }\r\n\r\n  if (!searchAllCities(req.query.city)) {\r\n    query += `AND p.address[0].city = '${req.query.city}' `;\r\n  }\r\n\r\n  query += `GROUP BY\r\n              substring(c.assertedDate, 0, 7) as year_month,\r\n              to_bigint((get_year(current_date()) - get_year(date(p.birthDate))) \/ 30) as age_group\r\n            ORDER BY year_month`\r\n\r\n  query = CbasQuery.fromString(query);\r\n\r\n  cluster.query(query, (error, result) =&gt; {\r\n    if (error) {\r\n      return res.status(500).send({ code: error.code, message: error.message });\r\n    }\r\n\r\n    let groups = [0, 1, 2, 3];\r\n    let stats = {};\r\n    let datasets = [];\r\n    let labels = [];\r\n\r\n    groups.forEach(group =&gt; stats[group] = {});\r\n\r\n    for (const record of result) {\r\n      if (!stats[record.age_group]) stats[record.age_group] = {};\r\n\r\n      if (!labels.includes(record.year_month)) {\r\n        labels.push(record.year_month);\r\n        groups.forEach(group =&gt; stats[group][record.year_month] = 0);\r\n      }\r\n\r\n      stats[record.age_group][record.year_month] += record.patient_count;\r\n    }\r\n\r\n    let knife = 0;\r\n\r\n    for (const key in stats) {\r\n      if (stats.hasOwnProperty(key)) {\r\n        var entries = [];\r\n\r\n        for (let nn = 0; nn &lt; labels.length; ++nn) {\r\n          entries.push(stats[key][labels[nn]]);\r\n        }\r\n\r\n        datasets.push({\r\n            data: entries,\r\n            label: `${30*key} - ${30*key + 29}`,\r\n            fill: false,\r\n            backgroundColor: 'rgba(0, 0, 0, 0)',\r\n            borderColor: palette[knife],\r\n            pointBackgroundColor: palette[knife]\r\n        });\r\n      }\r\n\r\n      knife = (knife + 1) % palette.length;\r\n    }\r\n\r\n    res.send({\r\n        labels: labels,\r\n        datasets: datasets\r\n    });\r\n  });\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>El c\u00f3digo de configuraci\u00f3n Express (en <code>app.js<\/code>) se encarga de conectar con el cluster. Pasa dos objetos de control globalmente compartibles, el <code>couchbase<\/code>que proporciona algunas interfaces generales, y el objeto <code>grupo<\/code>que es espec\u00edfico de un \u00fanico cl\u00faster.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>A partir de ah\u00ed, la lista anterior se divide en dos bloques: la generaci\u00f3n de la consulta y la gesti\u00f3n de los resultados.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_querying_with_sql\">Consultas con SQL<\/h3>\n<div class=\"paragraph\">\n<p>CBAS utiliza <a title=\"https:\/\/forward.ucsd.edu\/sqlpp.html\" href=\"https:\/\/forward.ucsd.edu\/sqlpp.html\">SQL<\/a>. Desarrollado en colaboraci\u00f3n con UC San Diego, UC Irvine y Couchbase, SQL++ es un lenguaje de consulta avanzado dise\u00f1ado para el formato JSON, pero compatible con SQL.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>La consulta se realiza a partir de dos tipos de documentos: Enfermedades y Pacientes. Lo que queremos representar gr\u00e1ficamente es el n\u00famero de pacientes con una enfermedad, ordenados por mes y a\u00f1o de inicio de la enfermedad y por edad. Al examinar la consulta, vemos que estamos obteniendo exactamente eso del tipo de documento <code>SELECCIONE<\/code> cl\u00e1usula.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>En <code>DESDE<\/code> puede parecer un poco sorprendente. Si echas un vistazo a la configuraci\u00f3n, ver\u00e1s que hemos configurado dos conjuntos de datos, <code>condici\u00f3n<\/code> y <code>paciente<\/code>. Se trata simplemente de buckets anal\u00edticos que comprenden los tipos de documentos correspondientes.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>A continuaci\u00f3n tenemos una serie de selectores que son el verdadero coraz\u00f3n de la consulta. La primera condici\u00f3n <code>substring_after(c.subject.reference, \"uuid:\") \/*+ indexnl *\/ = meta(p).id<\/code> es especialmente interesante. Esto limita los resultados a s\u00f3lo aquellos documentos en los que el sujeto (es decir, el paciente) del registro de condici\u00f3n coincide con el id de paciente del documento de paciente. En otras palabras, est\u00e1 realizando un inner join.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>En CBAS, las uniones internas utilizan por defecto un algoritmo hash. La secuencia corta que parece un comentario (<code>\/*+ indexnl *\/<\/code>) es en realidad una sugerencia al compilador de consultas para que intente realizar una uni\u00f3n de bucles anidados con \u00edndice. Esto puede ser m\u00e1s eficiente que un hash, pero requiere un \u00edndice. En este caso, el \u00edndice viene gratis en forma de claves de documento (id de documento) de los registros de pacientes.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>El resto de la consulta hace cosas como filtrar por condici\u00f3n, limitar los datos a un intervalo de 10 a\u00f1os, agrupar y ordenar la salida y dividirla en trozos de 30 a\u00f1os por edad del paciente. S\u00f3lo se desv\u00eda del SQL normal en otro punto. Un paciente puede tener m\u00e1s de una direcci\u00f3n.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Queremos filtrar por ciudad, si el usuario lo desea. Podemos hacerlo directamente, aunque las direcciones de los pacientes se guarden en un array. En este caso, con el fragmento <code>AND p.address[0].city = '${req.query.city}'<\/code>puedes ver que hemos elegido la primera direcci\u00f3n. Otros operadores le ofrecen formas m\u00e1s sofisticadas de manejar esto. Por ejemplo, puedes generar resultados separados para cada entrada del array.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_query_optimization\">Optimizaci\u00f3n de consultas<\/h3>\n<div class=\"paragraph\">\n<p>Optimizar las consultas puede ser fundamental para el \u00e9xito de una aplicaci\u00f3n. Con esto en mente, quiero profundizar un poco m\u00e1s en el join. La consola de administraci\u00f3n de Couchbase puede mostrar un plan de consulta, esencialmente un desglose de las operaciones que el planificador de consultas traza.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<div class=\"paragraph\">\n<p>No vamos a repasar un plan entero. En lugar de eso, echemos un vistazo a la diferencia que marca la sugerencia. He aqu\u00ed una comparaci\u00f3n de la misma consulta, con y sin la sugerencia.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/couchbaselabs\/blog-source-code\/master\/Greeley\/0049DemoAnalytics\/images\/PlanDiff.png\" alt=\"PlanDiff\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Podemos ver el n\u00facleo de la diferencia que hace la pista en las l\u00edneas 41-45. Como promet\u00ed, podemos ver que la versi\u00f3n sin la pista utiliza hashing, mientras que la que tiene la pista puede utilizar una b\u00fasqueda en el \u00e1rbol B.<\/p>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Adem\u00e1s, en la parte inferior de la comparaci\u00f3n vemos que la versi\u00f3n sin pistas realiz\u00f3 exploraciones y proyecciones de datos adicionales para obtener la informaci\u00f3n necesaria.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Quiero mencionar otro dato que me ayuda a leer estos planes. Al hojearlos, se ven muchas secciones que hacen referencia a un <code>intercambiar<\/code> operaci\u00f3n. En t\u00e9rminos generales, las operaciones de intercambio indican d\u00f3nde se particionan los datos y se procesan en paralelo. Puede leer m\u00e1s sobre ellas en <a title=\"https:\/\/blog.acolyer.org\/2015\/02\/11\/encapsulation-of-parallelism-in-the-volcano-query-processing-system\/\" href=\"https:\/\/blog.acolyer.org\/2015\/02\/11\/encapsulation-of-parallelism-in-the-volcano-query-processing-system\/\">esta entrada del blog<\/a>. Para una comprensi\u00f3n a\u00fan m\u00e1s completa, lea la secci\u00f3n D, parte 2 sobre conectores en la Biblioteca Hyracks <a title=\"https:\/\/asterix.ics.uci.edu\/pub\/ICDE11_conf_full_690.pdf\" href=\"https:\/\/asterix.ics.uci.edu\/pub\/ICDE11_conf_full_690.pdf\">aqu\u00ed<\/a>.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_query_results_and_rest_response\">Resultados de la consulta y respuesta REST<\/h3>\n<div class=\"paragraph\">\n<p>Una vez que tenemos la consulta SQL++ completa en forma de cadena, utilizamos el subobjeto CbasQuery del objeto couchbase para convertirla en una consulta que podamos entregar al cl\u00faster.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>El c\u00f3digo que sigue manipula los resultados en la forma utilizada por Chart.js. El c\u00f3digo puede parecer un poco enrevesado. Esto se debe a que s\u00f3lo queremos representar los meses en los que al menos un paciente tiene un diagn\u00f3stico. Tambi\u00e9n tenemos que tener en cuenta los conjuntos de resultados en los que el mismo mes puede tener pacientes de diferentes grupos de edad. He aqu\u00ed una peque\u00f1a muestra del aspecto de los datos.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"pygments highlight\"><code data-lang=\"json\">[\r\n...\r\n  {\r\n    \"year_month\": \"2008-12\",\r\n    \"age_group\": 2,\r\n    \"patient_count\": 1\r\n  },\r\n  {\r\n    \"year_month\": \"2009-02\",\r\n    \"age_group\": 0,\r\n    \"patient_count\": 1\r\n  },\r\n  {\r\n    \"year_month\": \"2009-02\",\r\n    \"age_group\": 1,\r\n    \"patient_count\": 3\r\n  },\r\n...\r\n]<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Como puede verse, en febrero de 2009 no hubo incidentes, mientras que en enero hubo pacientes de dos franjas de edad diferentes.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Volviendo al c\u00f3digo, vemos que el primer bucle crea dos estructuras de datos.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>En <code>etiquetas<\/code> dar\u00e1 el texto a lo largo del eje x de nuestro gr\u00e1fico con el a\u00f1o y el mes del inicio de la condici\u00f3n. El c\u00f3digo s\u00f3lo a\u00f1ade entradas para las fechas incluidas en el conjunto de resultados. Es posible que no incluya todos los meses del intervalo abarcado. (En esencia, estamos eliminando del gr\u00e1fico los meses en los que ning\u00fan paciente contrajo una afecci\u00f3n).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>En <code>Estad\u00edsticas<\/code> es una matriz bidimensional que suma el n\u00famero de pacientes de cada grupo de edad y a\u00f1o\/mes de inicio. Estos ser\u00e1n los datos reales representados.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Una vez que tenemos los datos en esta forma, el segundo bucle itera sobre las estad\u00edsticas y crea la estructura que Chart.js espera.<\/p>\n<\/div>\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>El resto del c\u00f3digo y las consultas de Analytics son muy similares a las partes que hemos examinado. Para m\u00e1s informaci\u00f3n y ejemplos, eche un vistazo al manual de Analytics <a title=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/analytics\/primer-beer.html\" href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/analytics\/primer-beer.html\">aqu\u00ed<\/a>. Utiliza datos de ejemplo distribuidos con cada versi\u00f3n de Couchbase.<\/p>\n<p>Para saber m\u00e1s sobre esta aplicaci\u00f3n de ejemplo, vea el v\u00eddeo de la keynote <a title=\"https:\/\/youtu.be\/-U_UjqnhMBI\" href=\"https:\/\/youtu.be\/-U_UjqnhMBI\">aqu\u00ed<\/a>junto con estos otros <a title=\"https:\/\/www.couchbase.com\/blog\/tag\/Connect-SV-2017-Demo\/\" href=\"https:\/\/www.couchbase.com\/blog\/es\/tag\/Connect-SV-2017-Demo\/\">puestos<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_postscript\">Posdata<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Couchbase es de c\u00f3digo abierto y <a title=\"https:\/\/www.couchbase.com\/downloads\" href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\">probar gratis<\/a>.<br \/>\n<strong>Empezar<\/strong> con <a title=\"https:\/\/www.couchbase.com\/get-started\" href=\"https:\/\/developer.couchbase.com\/tutorials\">c\u00f3digo de ejemplo, consultas de ejemplo, tutoriales y mucho m\u00e1s<\/a>.<br \/>\nM\u00e1s recursos en nuestra <a title=\"https:\/\/www.couchbase.com\/developers\/community\/\" href=\"https:\/\/www.couchbase.com\/blog\/es\/developers\/community\/\">portal para desarrolladores<\/a>.<br \/>\nS\u00edguenos en Twitter <a title=\"https:\/\/twitter.com\/CouchbaseDev\" href=\"https:\/\/twitter.com\/CouchbaseDev\">@CouchbaseDev<\/a>.<br \/>\nPuede enviar preguntas a nuestro <a title=\"https:\/\/www.couchbase.com\/forums\/\" href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/\">foros<\/a>.<br \/>\nParticipamos activamente en <a title=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\" href=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\">Stack Overflow<\/a>.<br \/>\nEnv\u00edame tus preguntas, comentarios, temas que te gustar\u00eda ver, etc. a Twitter. <a title=\"https:\/\/twitter.com\/HodGreeley\" href=\"https:\/\/twitter.com\/HodGreeley\">@HodGreeley<\/a><\/p>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Contents What is CBAS and how does it compare to &#8220;standard&#8221; Couchbase? Example Data and Configuration Code and Queries Web Client Web Server and Queries Querying with SQL++ Query Optimization Query Results and REST Response Conclusion Postscript With the release [&hellip;]<\/p>","protected":false},"author":73,"featured_media":5646,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,2294,1816,1822,1812],"tags":[1725,1392,2083],"ppma_author":[9042],"class_list":["post-5642","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-analytics","category-couchbase-server","category-node-js","category-n1ql-query","tag-nosql-database","tag-optimization","tag-vue-js"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.5 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>The Couchbase Data Platform in Action: Analytics - The Couchbase Blog<\/title>\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\/the-couchbase-data-platform-in-action-analytics\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The Couchbase Data Platform in Action: Analytics\" \/>\n<meta property=\"og:description\" content=\"Contents What is CBAS and how does it compare to &#8220;standard&#8221; Couchbase? Example Data and Configuration Code and Queries Web Client Web Server and Queries Querying with SQL++ Query Optimization Query Results and REST Response Conclusion Postscript With the release [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/the-couchbase-data-platform-in-action-analytics\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-08-22T19:22:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T04:23:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/AnalyticsExample.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2048\" \/>\n\t<meta property=\"og:image:height\" content=\"1415\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@HodGreeley\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\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\/the-couchbase-data-platform-in-action-analytics\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/\"},\"author\":{\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4\"},\"headline\":\"The Couchbase Data Platform in Action: Analytics\",\"datePublished\":\"2018-08-22T19:22:45+00:00\",\"dateModified\":\"2025-06-14T04:23:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/\"},\"wordCount\":1530,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/AnalyticsExample.png\",\"keywords\":[\"NoSQL Database\",\"optimization\",\"vue.js\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"Couchbase Analytics\",\"Couchbase Server\",\"Node.js\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/\",\"name\":\"The Couchbase Data Platform in Action: Analytics - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/AnalyticsExample.png\",\"datePublished\":\"2018-08-22T19:22:45+00:00\",\"dateModified\":\"2025-06-14T04:23:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/AnalyticsExample.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/AnalyticsExample.png\",\"width\":2048,\"height\":1415,\"caption\":\"Analytics Example\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The Couchbase Data Platform in Action: Analytics\"}]},{\"@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\/9b62593c8a13531e53d52fcd5aabbca4\",\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"caption\":\"Hod Greeley, Developer Advocate, Couchbase\"},\"description\":\"Hod Greeley is a Developer Advocate for Couchbase, living in Silicon Valley. He has over two decades of experience as a software engineer and engineering manager. He has worked in a variety of software fields, including computational physics and chemistry, computer and network security, finance, and mobile. Prior to joining Couchbase in 2016, Hod led developer relations for mobile at Samsung. Hod holds a Ph.D. in chemical physics from Columbia University.\",\"sameAs\":[\"https:\/\/hod.greeley.org\/blog\",\"https:\/\/x.com\/HodGreeley\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/hod-greeley\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"The Couchbase Data Platform in Action: Analytics - The Couchbase Blog","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\/the-couchbase-data-platform-in-action-analytics\/","og_locale":"es_MX","og_type":"article","og_title":"The Couchbase Data Platform in Action: Analytics","og_description":"Contents What is CBAS and how does it compare to &#8220;standard&#8221; Couchbase? Example Data and Configuration Code and Queries Web Client Web Server and Queries Querying with SQL++ Query Optimization Query Results and REST Response Conclusion Postscript With the release [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/the-couchbase-data-platform-in-action-analytics\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-08-22T19:22:45+00:00","article_modified_time":"2025-06-14T04:23:09+00:00","og_image":[{"width":2048,"height":1415,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/AnalyticsExample.png","type":"image\/png"}],"author":"Hod Greeley, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@HodGreeley","twitter_misc":{"Written by":"Hod Greeley, Developer Advocate, Couchbase","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/"},"author":{"name":"Hod Greeley, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4"},"headline":"The Couchbase Data Platform in Action: Analytics","datePublished":"2018-08-22T19:22:45+00:00","dateModified":"2025-06-14T04:23:09+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/"},"wordCount":1530,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/AnalyticsExample.png","keywords":["NoSQL Database","optimization","vue.js"],"articleSection":["Application Design","Best Practices and Tutorials","Couchbase Analytics","Couchbase Server","Node.js","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/","url":"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/","name":"The Couchbase Data Platform in Action: Analytics - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/AnalyticsExample.png","datePublished":"2018-08-22T19:22:45+00:00","dateModified":"2025-06-14T04:23:09+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/AnalyticsExample.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/08\/AnalyticsExample.png","width":2048,"height":1415,"caption":"Analytics Example"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/the-couchbase-data-platform-in-action-analytics\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"The Couchbase Data Platform in Action: Analytics"}]},{"@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\/9b62593c8a13531e53d52fcd5aabbca4","name":"Hod Greeley, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87","url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","caption":"Hod Greeley, Developer Advocate, Couchbase"},"description":"Hod Greeley es desarrollador de Couchbase y vive en Silicon Valley. Tiene m\u00e1s de dos d\u00e9cadas de experiencia como ingeniero de software y director de ingenier\u00eda. Ha trabajado en una variedad de campos de software, incluyendo f\u00edsica computacional y qu\u00edmica, seguridad inform\u00e1tica y de redes, finanzas y m\u00f3viles. Antes de unirse a Couchbase en 2016, Hod dirigi\u00f3 las relaciones con desarrolladores para m\u00f3viles en Samsung. Hod es doctor en f\u00edsica qu\u00edmica por la Universidad de Columbia.","sameAs":["https:\/\/hod.greeley.org\/blog","https:\/\/x.com\/HodGreeley"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/hod-greeley\/"}]}},"authors":[{"term_id":9042,"user_id":73,"is_guest":0,"slug":"hod-greeley","display_name":"Hod Greeley, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","author_category":"","last_name":"Greeley","first_name":"Hod","job_title":"","user_url":"https:\/\/hod.greeley.org\/blog","description":"Hod Greeley es desarrollador de Couchbase y vive en Silicon Valley. Tiene m\u00e1s de dos d\u00e9cadas de experiencia como ingeniero de software y director de ingenier\u00eda. Ha trabajado en una variedad de campos de software, incluyendo f\u00edsica computacional y qu\u00edmica, seguridad inform\u00e1tica y de redes, finanzas y m\u00f3viles. Antes de unirse a Couchbase en 2016, Hod dirigi\u00f3 las relaciones con desarrolladores para m\u00f3viles en Samsung. Hod es doctor en f\u00edsica qu\u00edmica por la Universidad de Columbia."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5642","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\/73"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=5642"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5642\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/5646"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=5642"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=5642"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=5642"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=5642"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}