{"id":16783,"date":"2025-01-20T11:24:26","date_gmt":"2025-01-20T19:24:26","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=16783"},"modified":"2025-01-20T11:24:26","modified_gmt":"2025-01-20T19:24:26","slug":"couchbase-shell-time-series-data","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-shell-time-series-data\/","title":{"rendered":"Grafique datos de series temporales desde la comodidad de su terminal"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Si has estado siguiendo las entradas anteriores en el blog de Couchbase, habr\u00e1s visto <a href=\"https:\/\/www.couchbase.com\/blog\/es\/tag\/cbshell\/\">contenido sobre Couchbase Shell<\/a> \u00faltima versi\u00f3n. Estoy probando diferentes cosas y hoy quer\u00eda ver qu\u00e9 pod\u00eda hacer con conjuntos de datos de series temporales.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Ingesta de datos de series temporales<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Navegando por Kaggle, encontr\u00e9 <a href=\"https:\/\/www.kaggle.com\/datasets\/berkeleyearth\/climate-change-earth-surface-temperature-data?resource=download\">datos de temperatura por Ciudad<\/a><\/span><span style=\"font-weight: 400;\">. Lo he descargado. Pesa unos 500Mb y eso lo hace dif\u00edcil de manipular en su conjunto. Pero, por supuesto, es un archivo de texto por lo que f\u00e1cilmente podemos echar un vistazo a la estructura de datos as\u00ed:<\/span><\/p>\n<pre class=\"line-height:12 nums:false wrap-toggle:false lang:sh decode:true\">&gt; open GlobalLandTemperaturesByCity.csv | first 10\r\n\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 dt \u2502 AverageTemperature \u2502 AverageTemperatureUncertainty \u2502 Ciudad \u2502 Pa\u00eds \u2502 Latitud \u2502 Longitud \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 1743-11-01 \u2502 6,07 \u2502 1,74 \u2502 Aarhus \u2502 Dinamarca \u2502 57,05N \u2502 10,33E \u2502\r\n\u2502 1 \u2502 1743-12-01 \u2502 \u2502 \u00c5rhus \u2502 Dinamarca \u2502 57.05N \u2502 10.33E \u2502\r\n\u2502 2 \u2502 1744-01-01 \u2502 \u2502 \u00c5rhus \u2502 Dinamarca \u2502 57.05N \u2502 10.33E \u2502\r\n\u2502 3 \u2502 1744-02-01 \u2502 \u2502 \u00c5rhus \u2502 Dinamarca \u2502 57.05N \u2502 10.33E \u2502\r\n\u2502 4 \u2502 1744-03-01 \u2502 \u2502 \u00c5rhus \u2502 Dinamarca \u2502 57.05N \u2502 10.33E \u2502\r\n\u2502 5 \u2502 1744-04-01 \u2502 5.79 \u2502 3.62 \u2502 Aarhus \u2502 Dinamarca \u2502 57.05N \u2502 10.33E \u2502\r\n\u2502 6 \u2502 1744-05-01 \u2502 10.64 \u2502 1.28 \u2502 \u00c5rhus \u2502 Dinamarca \u2502 57.05N \u2502 10.33E \u2502\r\n\u2502 7 \u2502 1744-06-01 \u2502 14.05 \u2502 1.35 \u2502 \u00c5rhus \u2502 Dinamarca \u2502 57.05N \u2502 10.33E \u2502\r\n\u2502 8 \u2502 1744-07-01 \u2502 16.08 \u2502 1.40 \u2502 \u00c5rhus \u2502 Dinamarca \u2502 57.05N \u2502 10.33E \u2502\r\n\u2502 9 \u2502 1744-08-01 \u2502 \u2502 \u00c5rhus \u2502 Dinamarca \u2502 57.05N \u2502 10.33E \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f<\/pre>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">&gt; open GlobalLandTemperaturesByCity.csv | length\r\n\r\n8599212<\/pre>\n<p><span style=\"font-weight: 400;\">8599212 l\u00edneas, esto va a ser 8599211 documentos. Mi objetivo final es ver un gr\u00e1fico de temperatura de varias ciudades a lo largo de los a\u00f1os. Para ello, primero voy a importar todo a un bucket de importaci\u00f3n, luego transformar\u00e9 los datos en series temporales. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Si importo esto ingenuamente, me da un doc por ciudad\/grupo de meses. As\u00ed que la clave de mi documento ser\u00e1 como <em>Aarhus:1743-11-01<\/em>. Digamos que s\u00f3lo quiero subir la primera l\u00ednea, deber\u00eda tener este aspecto:<\/span><\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">&gt; open GlobalLandTemperaturesByCity.csv | first 1 | wrap content | insert id { |x| $\"($x.content.City):($x.content.dt)\" }\r\n\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 contenido \u2502 id \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 {registrar 7 campos} \u2502 \u00c5rhus:1743-11-01 \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\r\n\r\n&gt; open GlobalLandTemperaturesByCity.csv | first 1 | wrap content | insert id { |x| $\"($x.content.City):($x.content.dt)\" } |doc upsert\r\n\r\n\u256d\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e\r\n\u2502 # \u2502 procesado \u2502 \u00e9xito \u2502 fracasado \u2502 fracasos \u2502 cl\u00faster \u2502\r\n\u251c\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0 \u2502 1 \u2502 1 \u2502 0 \u2502 \u2502 capella \u2502\r\n\u2570\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256f\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">Y ahora que s\u00e9 que funciona, vamos a cogerlo todo y a meterlo en el lote:<\/span><\/p>\n<pre class=\"line-height:12 nums-toggle:false wrap:true lang:default decode:true\">open GlobalLandTemperaturesByCity.csv | par-each -t 5 {|x| wrap content | insert id {$\"($x.City):($x.dt)\" } } | doc upsert\r\n\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">He creado un <\/span><span style=\"font-weight: 400;\">serie<\/span><span style=\"font-weight: 400;\"> en la que importo el resultado de una <em>SELECCIONE<\/em> agregaci\u00f3n, obteniendo todas las fechas como marcas de tiempo y todas las <\/span><i><span style=\"font-weight: 400;\">Temperatura media <\/span><\/i><span style=\"font-weight: 400;\">como valor:<\/span><\/p>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">consulta '\r\n\r\nINSERT INTO series(CLAVE _k, VALOR _v)\r\n    SELECT a.Ciudad _k,\r\n    {\"Ciudad\": a.Ciudad ,\r\n      \"ts_start\" : MIN(STR_TO_MILLIS(a.dt)),\r\n      \"ts_end\" : MAX(STR_TO_MILLIS(a.dt)),\r\n      \"ts_data\" : ARRAY_AGG([STR_TO_MILLIS(a.dt), a.AverageTemperature]) } _v\r\n    FROM importar a\r\n    WHERE a.dt ENTRE \"1700-01-01\" Y \"2020-12-31\"\r\n    GROUP BY a.Ciudad;\r\n    '\r\n\r\n    INSERT INTO series(CLAVE _k, VALOR _v)\r\n    SELECT a.Ciudad _k,\r\n    {\"Ciudad\": a.Ciudad ,\r\n      \"ts_start\" : MIN(STR_TO_MILLIS(a.dt)),\r\n      \"ts_end\" : MAX(STR_TO_MILLIS(a.dt)),\r\n      \"ts_data\" : ARRAY_AGG([STR_TO_MILLIS(a.dt), a.AverageTemperature]) } _v\r\n    FROM importar a\r\n    WHERE SUBSTR(a.City,0,1) = \"Z\" AND a.dt BETWEEN \"2010-01-01\" Y \"2020-12-31\"\r\n    GROUP BY a.Ciudad;\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">Y ahora todos los datos est\u00e1n disponibles como series temporales. Digamos que quiero los datos de Par\u00eds, puedo utilizar la funci\u00f3n <em>_timeseries<\/em> funcionar as\u00ed:<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">let ts_ranges = [946684800000,1375315200000]; query $ \"SELECT t._t time, t._v0 `value` FROM series AS d UNNEST _timeseries(d, {\\\"ts_ranges\\\":($ts_ranges)}\\}) AS t WHERE d.city = \\\"Paris\\\" AND \\(d.ts_start = ($ts_ranges.1)}) AS t WHERE d.city = \\\"Paris\\\" AND \\(d.ts_start = ($ts_ranges.0) \\);\" | rechazar cluster | a csv\r\n\r\ntiempo,valor\r\n946684800000,3.845\r\n949363200000,6.587000000000001\r\n951868800000,7.872000000000001\r\n954547200000,10.067\r\n957139200000,15.451\r\n959817600000,17.666\r\n962409600000,16.954\r\n965088000000,19.512\r\n967766400000,16.548000000000002\r\n970358400000,11.675999999999998\r\n....<\/pre>\n<p><span style=\"font-weight: 400;\">Para acelerar las cosas puedes crear el siguiente \u00edndice: <\/span><span style=\"font-weight: 400;\"><code>CREATE INDEX ix1 ON series(Ciudad, ts_end, ts_start);<\/code><\/span><\/p>\n<p><span style=\"font-weight: 400;\">Obs\u00e9rvese el uso de la <em>ts_rangos<\/em> al principio. Puede reutilizar f\u00e1cilmente esos valores en una plantilla <em>Cadena<\/em>. Empiezan con un<em> $<\/em> y las variables deben ir entre par\u00e9ntesis como <em>($my_variable)<\/em>. Lo que tambi\u00e9n significa que ahora es necesario escapar del car\u00e1cter par\u00e9ntesis, as\u00ed como de las comillas dobles.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Trazar series temporales<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Hay una variedad de bibliotecas de trazado de terminales, aqu\u00ed estoy usando <\/span><a href=\"https:\/\/github.com\/red-data-tools\/YouPlot\"><span style=\"font-weight: 400;\">youplot<\/span><\/a>:<\/p>\n<pre class=\"line-height:12 nums:false wrap:true lang:default decode:true\">let ts_ranges = [946684800000,1375315200000]; query $ \"SELECT t._t date, t._v0 `value` FROM series AS d UNNEST _timeseries(d, {\\\"ts_ranges\\\":($ts_ranges)}\\}) AS t WHERE d.city = \"Paris\\\" AND \\(d.ts_start = ($ts_ranges.1)}) AS t WHERE d.city = \\\"Paris\\\" AND \\(d.ts_start = ($ts_ranges.0) \\);\" | reject cluster | to csv | uplot line -d, --xlim 946684800000,1375315200000 --ylim -20,35 --title \"temperatura global en Par\u00eds\" --xlabel date --ylabel temperature`<\/pre>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image1-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-16784 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image1-1-1024x677.png\" alt=\"\" width=\"900\" height=\"595\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image1-1-1024x677.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image1-1-300x198.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image1-1-768x507.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image1-1.png 1108w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Todo esto est\u00e1 muy bien, pero lo ideal ser\u00eda tener varias ciudades para poder compararlas. Cualquier columna CSV adicional se recoge autom\u00e1ticamente siempre que ejecute <\/span><span style=\"font-weight: 400;\">l\u00edneas youplot<\/span><span style=\"font-weight: 400;\">. Haciendo las cosas poco a poco, vamos a empezar con el apoyo de m\u00faltiples ciudades en la consulta. As\u00ed que un par de cambios aqu\u00ed:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">agrupar los datos por tiempo<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">a\u00f1adiendo <\/span><em><span style=\"font-weight: 400;\">d.ciudad IN ($city)<\/span><\/em><span style=\"font-weight: 400;\"> a la cl\u00e1usula where. Esto funciona porque la matriz de ciudades es una cadena literal de una matriz JSON. Veamos la respuesta como un documento JSON:<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre class=\"line-height:12 nums:false lang:default decode:true\">&gt; let ts_ranges = [946684800000,1375315200000]; let city = ['\"Aba\"','\"Berlin\"','\"London\"','\"Paris\"']; query $ \"SELECT t._t date, \\( ARRAY_AGG\\({\\\"city\\\": d.city, \\\"temp\\\":t._v0}) \\)  FROM series AS d UNNEST _timeseries(d, {\\\"ts_ranges\\\":($ts_ranges)}\\) AS t WHERE d.city IN ($city) AND \\(d.ts_start = ($ts_ranges.0) \\) GROUP BY t._t ORDER BY t._t;\" | reject cluster | first |to json\r\n\r\n[\r\n  {\r\n    \"date\": \"2000-01-01\",\r\n    \"$1\":\r\n    [\r\n      {\r\n        \"ciudad\": \"Aba\",\r\n        \"temp\": 26.985000000000007\r\n      },\r\n      {\r\n        \"ciudad\": \"Berlin\",\r\n        \"temp\": 1.3239999999999998\r\n      },\r\n      {\r\n        \"city\": \"London\",\r\n        \"temp\": 4.6930000000000005\r\n      },\r\n      {\r\n        \"ciudad\": \"Paris\",\r\n        \"temp\": 3.845\r\n      }\r\n    ]\r\n  }\r\n]<\/pre>\n<p><span style=\"font-weight: 400;\">Pero esto no se puede convertir en un CSV, incluso si se aplana todo de esta manera:<\/span><\/p>\n<pre class=\"line-height:12 nums:false wrap:true lang:default decode:true\">&gt; let ts_ranges = [946684800000,1375315200000]; let city = ['\"Aba\"','\"Berlin\"','\"London\"','\"Paris\"']; query $ \"SELECT t._t date, \\( ARRAY_AGG\\({\\\"city\\\": d.city, \\\"temp\\\":t._v0}) \\)  FROM series AS d UNNEST _timeseries(d, {\\\"ts_ranges\\\":($ts_ranges)}\\) AS t WHERE d.city IN ($city) AND \\(d.ts_start = ($ts_ranges.0) \\) GROUP BY t._t ORDER BY t._t;\" |reject cluster | first |flatten|flatten|to csv\r\n\r\nfecha,ciudad,temp\r\n2000-01-01,Aba,26.985000000000007\r\n2000-01-01,Berlin,1.3239999999999998\r\n2000-01-01,London,4.6930000000000005\r\n2000-01-01,Paris,3.845<\/pre>\n<p><span style=\"font-weight: 400;\">As\u00ed que podemos transformarlo en un objeto de esta manera: <\/span><span style=\"font-weight: 400;\"><code>Objeto v.ciudad : v.temp FOR v IN ARRAY_AGG({\"ciudad\": d.ciudad, \"temp\":t._v0}) when v IS NOT MISSING END<\/code><\/span><\/p>\n<pre class=\"line-height:12 nums:false wrap:true lang:default decode:true\">&gt; let ts_ranges = [946684800000,1375315200000]; let city = ['\"Aba\"','\"Berlin\"','\"London\"','\"Paris\"']; query $ \"SELECT t._t date, \\( Object v.city : v.temp FOR v IN ARRAY_AGG\\({\"city\\\": d.city, \\\"temp\\\":t._v0}\\) when v IS NOT MISSING END\\)  FROM series AS d UNNEST _timeseries(d, {\\\"ts_ranges\\\":($ts_ranges)}\\) AS t WHERE d.city IN ($city) AND \\(d.ts_start = ($ts_ranges.0) \\) GROUP BY t._t ORDER BY t._t;\" |reject cluster | first | to json\r\n\r\n{\r\n  \"date\": \"2000-01-01\",\r\n  \"$1\":\r\n  {\r\n    \"Aba\": 26.985000000000007,\r\n    \"Berlin\": 1.3239999999999998,\r\n    \"Londres\": 4.6930000000000005,\r\n    \"Par\u00eds\": 3.845\r\n  }\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Que ahora se puede aplanar en un CSV:<\/span><\/p>\n<pre class=\"line-height:12 nums:false wrap:true lang:default decode:true\">&gt; let ts_ranges = [946684800000,1375315200000]; let city = ['\"Aba\"','\"Berlin\"','\"London\"','\"Paris\"']; query $ \"SELECT t._t date, \\( Object v.city : v.temp FOR v IN ARRAY_AGG\\({\"city\\\": d.city, \\\"temp\\\":t._v0}\\) when v IS NOT MISSING END\\)  FROM series AS d UNNEST _timeseries(d, {\\\"ts_ranges\\\":($ts_ranges)}\\) AS t WHERE d.city IN ($city) AND \\(d.ts_start = ($ts_ranges.0) \\) GROUP BY t._t ORDER BY t._t;\" |reject cluster | first | flatten| to csv\r\n\r\nfecha,Aba,Berl\u00edn,Londres,Par\u00eds\r\n\r\n2000-01-01,26.985000000000007,1.3239999999999998,4.6930000000000005,3.845<\/pre>\n<p><span style=\"font-weight: 400;\">Y con eso estamos listos para trazar varias l\u00edneas:<\/span><\/p>\n<pre class=\"line-height:12 nums:false wrap:true lang:default decode:true\">&gt; let ts_ranges = [946684800000,1375315200000]; let city = ['\"Aba\"','\"Berlin\"','\"London\"','\"Paris\"']; query $ \"SELECT t._t date, \\( Object v.city : v.temp FOR v IN ARRAY_AGG\\({\"city\\\": d.city, \\\"temp\\\":t._v0}\\) when v IS NOT MISSING END\\)  FROM series AS d UNNEST _timeseries(d, {\\\"ts_ranges\\\":($ts_ranges)}\\) AS t WHERE d.city IN ($city) AND \\(d.ts_start = ($ts_ranges.0) \\) GROUP BY t._t ORDER BY t._t;\" |reject cluster | flatten | to csv | uplot lines -H -d, --xlim 946684800000,1375315200000 --ylim -10,50 -w 50 --title \"temperatura por mes\" --xlabel fecha --ylabel temperatura<\/pre>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image2-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-16785 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image2-1-1024x676.png\" alt=\"\" width=\"900\" height=\"594\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image2-1-1024x676.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image2-1-300x198.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image2-1-768x507.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image2-1.png 1101w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Para hacerlo m\u00e1s f\u00e1cil, puedes utilizar funciones. Crea una <em>.nu<\/em> como <em>temp.nu<\/em>con el siguiente contenido:<\/span><\/p>\n<pre class=\"line-height:12 nums:false wrap:true lang:default decode:true\">def tempGraph [$ts_rangos, $cities] {\r\n    cb-env bucket cbsh\r\n    cb-env scope globaltemp\r\n    cb-env collection series\r\n    \r\n    let query = ($ \"SELECT t._t date, \\( Object v.city : v.temp FOR v IN ARRAY_AGG\\({\\\"city\\\": d.city, \\\"temp\\\":t._v0}\\) when v IS NOT MISSING END\\)\"\r\n     + $\" FROM series AS d UNNEST _timeseries(d, {\\\"ts_ranges\\\":($ts_ranges)}\\) AS t \"\r\n     + $\" WHERE d.city IN ($city) \"\r\n     + $\" AND \\(d.ts_start = ($ts_ranges.0) \\)\"\r\n     + $\" GROUP BY t._t ORDER BY t._t;\" )\r\n    let csv = query $query |reject cluster | flatten | to csv\r\n    $csv | uplot lines -H -d, --xlim 946684800000,1375315200000 --ylim -10,50 -w 50 --title \"temperatura por mes\" --xlabel fecha --ylabel temperatura\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Luego, si se abastece, es mucho m\u00e1s f\u00e1cil de usar:<\/span><\/p>\n<pre class=\"line-height:12 nums:false wrap:true lang:default decode:true\">&gt; source .\/testingcbshell\/temp.nu\r\n\r\n&gt; tempGraph [946684800000,1375315200000] ['\"Aba\"','\"Berlin\"','\"London\"','\"Paris\"']\r\n\r\n<\/pre>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-16786\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1-1024x683.png\" alt=\"\" width=\"900\" height=\"600\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1-1024x683.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1-300x200.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1-768x512.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1-400x267.png 400w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1-450x300.png 450w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/image3-1.png 1103w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<hr \/>\n<p><span style=\"font-weight: 400;\">Espero que esto te haya dado una r\u00e1pida visi\u00f3n general del soporte de series temporales de Couchbase, de la manipulaci\u00f3n de datos de Couchbase Shell, y de c\u00f3mo puedes usar otros comandos de shell como <em>youplot<\/em> para hacer las cosas m\u00e1s integradas e interesantes. Podr\u00eda generar f\u00e1cilmente un informe completo en varios formatos a partir de un <a href=\"https:\/\/github.com\/features\/actions\">Acciones de GitHub<\/a> por ejemplo, \u00a1un sinf\u00edn de posibilidades!<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Leer m\u00e1s art\u00edculos sobre <a href=\"https:\/\/www.couchbase.com\/blog\/es\/tag\/cbshell\/\">Shell de Couchbase<\/a>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>If you have been following the earlier posts on the Couchbase blog, you have seen content about Couchbase Shell latest release. I am trying different things and today I wanted to see what I could do with time series datasets. [&hellip;]<\/p>","protected":false},"author":49,"featured_media":16788,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1812],"tags":[10020,10024,9827],"ppma_author":[9023],"class_list":["post-16783","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-n1ql-query","tag-cbshell","tag-couchbase-shell","tag-time-series"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Graph Time Series Data From the Comfort of Your Terminal - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Learn to manage and analyze time series data with Couchbase Shell, from ingestion to visualization using global temperature datasets.\" \/>\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\/couchbase-shell-time-series-data\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Graph Time Series Data From the Comfort of Your Terminal\" \/>\n<meta property=\"og:description\" content=\"Learn to manage and analyze time series data with Couchbase Shell, from ingestion to visualization using global temperature datasets.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-shell-time-series-data\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-01-20T19:24:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"unstructured.io\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"Graph Time Series Data From the Comfort of Your Terminal\",\"datePublished\":\"2025-01-20T19:24:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/\"},\"wordCount\":554,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png\",\"keywords\":[\"cbshell\",\"couchbase shell\",\"time series\"],\"articleSection\":[\"Best Practices and Tutorials\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/\",\"name\":\"Graph Time Series Data From the Comfort of Your Terminal - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png\",\"datePublished\":\"2025-01-20T19:24:26+00:00\",\"description\":\"Learn to manage and analyze time series data with Couchbase Shell, from ingestion to visualization using global temperature datasets.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Graph Time Series Data From the Comfort of Your Terminal\"}]},{\"@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\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\/\/x.com\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/laurent-doguin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Graph Time Series Data From the Comfort of Your Terminal - The Couchbase Blog","description":"Aprenda a gestionar y analizar datos de series temporales con Couchbase Shell, desde la ingesta hasta la visualizaci\u00f3n utilizando conjuntos de datos de temperatura global.","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\/couchbase-shell-time-series-data\/","og_locale":"es_MX","og_type":"article","og_title":"Graph Time Series Data From the Comfort of Your Terminal","og_description":"Learn to manage and analyze time series data with Couchbase Shell, from ingestion to visualization using global temperature datasets.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-shell-time-series-data\/","og_site_name":"The Couchbase Blog","article_published_time":"2025-01-20T19:24:26+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png","type":"image\/png"}],"author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"Graph Time Series Data From the Comfort of Your Terminal","datePublished":"2025-01-20T19:24:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/"},"wordCount":554,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png","keywords":["cbshell","couchbase shell","time series"],"articleSection":["Best Practices and Tutorials","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/","name":"Graph Time Series Data From the Comfort of Your Terminal - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png","datePublished":"2025-01-20T19:24:26+00:00","description":"Aprenda a gestionar y analizar datos de series temporales con Couchbase Shell, desde la ingesta hasta la visualizaci\u00f3n utilizando conjuntos de datos de temperatura global.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/01\/blog-couchbase-shell-time-series-graph.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-shell-time-series-data\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Graph Time Series Data From the Comfort of Your Terminal"}]},{"@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\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"Laurent Doguin","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"Laurent es un metalero empoll\u00f3n que vive en Par\u00eds. Principalmente escribe c\u00f3digo en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programaci\u00f3n reactiva y otras cosas de moda. Tambi\u00e9n fue Developer Advocate de Clever Cloud y Nuxeo, donde dedic\u00f3 su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/laurent-doguin\/"}]}},"authors":[{"term_id":9023,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","author_category":"","last_name":"Doguin","first_name":"Laurent","job_title":"","user_url":"","description":"Laurent es un metalero empoll\u00f3n que vive en Par\u00eds. Principalmente escribe c\u00f3digo en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programaci\u00f3n reactiva y otras cosas de moda. Tambi\u00e9n fue Developer Advocate de Clever Cloud y Nuxeo, donde dedic\u00f3 su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/16783","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\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=16783"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/16783\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/16788"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=16783"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=16783"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=16783"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=16783"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}