{"id":5885,"date":"2018-10-11T12:04:19","date_gmt":"2018-10-11T19:04:19","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5885"},"modified":"2025-06-13T21:20:30","modified_gmt":"2025-06-14T04:20:30","slug":"a-couchbase-analytics-example-using-the-go-sdk","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/a-couchbase-analytics-example-using-the-go-sdk\/","title":{"rendered":"Un ejemplo de Couchbase Analytics usando el SDK Go"},"content":{"rendered":"<p><span style=\"font-weight: 400\">Este post ilustra el uso de Couchbase Analytics con el SDK de Couchbase Go. Couchbase Analytics es un nuevo servicio disponible en Couchbase Server 6.0, puedes leer m\u00e1s en <a href=\"https:\/\/docs.couchbase.com\/server\/6.0\/analytics\/introduction.html\">https:\/\/docs.couchbase.com\/server\/6.0\/analytics\/introduction.html<\/a>. <\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\">En este post vamos a utilizar un conjunto de datos del mundo real que es lo suficientemente grande como para no caber en la memoria (al menos en mi m\u00e1quina local). Vamos a utilizar el <\/span><a href=\"https:\/\/data.cityofnewyork.us\/api\/views\/hvrh-b6nb\/rows.csv?accessType=DOWNLOAD\"><span style=\"font-weight: 400\">Exportaci\u00f3n CSV<\/span><\/a><span style=\"font-weight: 400\"> de la <\/span><a href=\"https:\/\/data.cityofnewyork.us\/Transportation\/2016-Green-Taxi-Trip-Data\/hvrh-b6nb\"><span style=\"font-weight: 400\">Conjunto de datos de trayectos en taxi ecol\u00f3gico en NYC en 2016<\/span><\/a><span style=\"font-weight: 400\">. Se trata de un conjunto de datos de ~16,4 millones de registros con 23 campos por registro. Puede seguir el proceso y probar la aplicaci\u00f3n clonando el proyecto <\/span><a href=\"https:\/\/github.com\/chvck\/gocb-taxi-analytics\"><span style=\"font-weight: 400\">aqu\u00ed<\/span><\/a><span style=\"font-weight: 400\">o ejecute <span class=\"lang:default decode:true crayon-inline\">go get github.com\/chvck\/gocb-taxi-analytics<\/span>\u00a0<\/span><span style=\"font-weight: 400\">.<\/span><span style=\"font-weight: 400\"> Tambi\u00e9n tendr\u00e1 que ejecutar <span class=\"lang:default decode:true crayon-inline\">go get .\/&#8230;<\/span>\u00a0<\/span><span style=\"font-weight: 400\">si has clonado el proyecto con git.<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\">Como se trata de un archivo CSV, lo primero que hay que hacer es importarlo. Desafortunadamente, este conjunto de datos utiliza formatos de fecha y hora no est\u00e1ndar, por lo que necesitamos utilizar un peque\u00f1o script para convertirlos en algo m\u00e1s utilizable. Si has clonado <\/span><a href=\"https:\/\/github.com\/chvck\/gocb-taxi-analytics\"><span style=\"font-weight: 400\">el proyecto<\/span><\/a><span style=\"font-weight: 400\"> puede hacerlo con <\/span><\/p>\n<pre class=\"lang:default decode:true\">go run main.go --reformat --csv \/path\/to\/taxis.csv<\/pre>\n<p><span style=\"font-weight: 400\">Esto crear\u00e1 un <span class=\"lang:default decode:true crayon-inline\">2016_Green_Taxi_Trip_Data.csv<\/span>\u00a0<\/span><span style=\"font-weight: 400\">\u00a0en el directorio del proyecto. Tambi\u00e9n he aprovechado esta oportunidad para cambiar las cabeceras CSV para hacerlas m\u00e1s amigables con JSON y tambi\u00e9n a\u00f1adir un campo de tipo siempre establecido en verde (en caso de que m\u00e1s tarde quisi\u00e9ramos a\u00f1adir tambi\u00e9n el conjunto de datos de taxis amarillos). Durante la conversi\u00f3n tambi\u00e9n podr\u00edamos haber importado los datos pero ya tenemos una gran herramienta en <\/span><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/tools\/cbimport.html\"><span style=\"font-weight: 400\">cbimport<\/span><\/a><span style=\"font-weight: 400\"> que podemos utilizar. Cree un cubo llamado <\/span><span style=\"font-weight: 400\">taxis <\/span><span style=\"font-weight: 400\">con la evicci\u00f3n completa activada (en Advanced bucket settings - no estaremos ejecutando operaciones k\/v por lo que el rendimiento k\/v no importa tanto en este caso) y luego ejecutar:<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><\/p>\n<pre class=\"wrap:true lang:default decode:true\">cbimport csv --cluster couchbase:\/\/localhost -u user -p password -b taxis --infer-types -omit-empty -d file:\/\/\/path\/to\/2016_Green_Taxi_Trip_Data.csv -l import.log -g green::%vendorID%::#MONO_INCR#<\/pre>\n<p><span style=\"font-weight: 400\">Cada documento tendr\u00e1 un identificador \u00fanico como <span class=\"lang:default decode:true crayon-inline\">green::1::1000<\/span>\u00a0. Normalmente, estos dos pasos no ser\u00edan necesarios, ya que nuestros datos ya estar\u00edan almacenados en Couchbase.<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\">Antes de poder trabajar con Couchbase Analytics tienes que preparar un conjunto de datos que te permita consultarlos:<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><\/p>\n<pre class=\"lang:default decode:true\">CREATE DATASET alltaxis ON taxis;<\/pre>\n<p><span style=\"font-weight: 400\">Este conjunto de datos requiere algunos recursos. Si quieres experimentar con un conjunto de datos ligeramente m\u00e1s peque\u00f1o en un port\u00e1til con pocos recursos, puedes crear un conjunto de datos filtrado que solo rastrear\u00e1 un subconjunto de los documentos de tu cubo:<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><\/p>\n<pre class=\"lang:default decode:true\">CREATE DATASET alltaxis ON taxis WHERE `vendorID` = 1;<\/pre>\n<p><span style=\"font-weight: 400\">As\u00ed obtendr\u00e1 un conjunto de datos de algo m\u00e1s de 3 millones de documentos.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Una vez que haya creado uno de los conjuntos de datos, deber\u00e1 inicializarlo activando el procesamiento de conjuntos de datos con:<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><\/p>\n<pre class=\"lang:default decode:true\">CONNECT LINK Local;<\/pre>\n<p><span style=\"font-weight: 400\">Esto comenzar\u00e1 a rellenar el conjunto de datos que acaba de crear. Puede ver el progreso en la interfaz de usuario, en la columna de conjuntos de datos de la derecha, debajo del nombre del conjunto de datos. Puede seguir trabajando con el conjunto de datos mientras se construye, pero ver\u00e1 resultados diferentes cada vez que ejecute una consulta y la ejecuci\u00f3n puede ser un poco m\u00e1s lenta.<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\">Como vamos a hacer an\u00e1lisis de datos, merece la pena investigar un par de cosas. Creo que un buen punto de partida ser\u00eda conocer el n\u00famero de viajes en taxi a lo largo del a\u00f1o y poder aplicar varios filtros para ver cosas como las propinas frente a las tarifas.<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\">La base que utilizaremos para nuestras consultas es:<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECT DATE_PART_STR(pickupDate, \"month\") AS period, COUNT(*) as count FROM alltaxis GROUP BY DATE_PART_STR(pickupDate, \"month\") ORDER BY period;\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Esta consulta extrae el mes como un n\u00famero (1-12) del archivo <\/span><span style=\"font-weight: 400\">pickupDate<\/span><span style=\"font-weight: 400\"> y mostrando el n\u00famero de desplazamientos en funci\u00f3n del mes. La consulta muestra que marzo es el mes con m\u00e1s desplazamientos y noviembre el que menos. Tambi\u00e9n se observa una tendencia a la baja a lo largo del a\u00f1o. Esperaba que el verano tuviera menos desplazamientos que el resto del a\u00f1o, as\u00ed que ya he aprendido algo.<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\">En mi m\u00e1quina, esta consulta tarda unos 24 s en ejecutar el conjunto de datos completo. Ejecutando lo mismo contra el servicio de consulta operacional (a menudo referido simplemente como N1QL, pero ese es el lenguaje) con s\u00f3lo un \u00edndice primario los tiempos se agotan desde la consola de consulta (600s). Podemos ver que para consultas ad hoc en grandes conjuntos de datos Couchbase Analytics es una buena opci\u00f3n, complementando el servicio de consulta operacional N1QL .<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Consultas desde una aplicaci\u00f3n Golang<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Ahora que hemos configurado y comprobado que nuestro conjunto de datos de Analytics funciona, podemos utilizarlo a trav\u00e9s del SDK de Go. En la ventana <\/span><span style=\"font-weight: 400\">runServer <\/span><span style=\"font-weight: 400\">funci\u00f3n que tenemos:<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><\/p>\n<pre class=\"lang:go decode:true\">var err error\r\ncluster, err = gocb.Connect(cbConnStr)\r\nif err != nil {\r\n\tpanic(\"Error connecting to cluster:\" + err.Error())\r\n}\r\n\r\ncluster.Authenticate(gocb.PasswordAuthenticator{\r\n\tUsername: cbUsername,\r\n\tPassword: cbPassword,\r\n})\r\n\r\n\t\r\n_, err = cluster.OpenBucket(\"taxis\", \"\")\r\nif err != nil {\r\n\tlog.Fatal(err)\r\n}\r\n\r\nstop := make(chan os.Signal, 1)\r\n\r\n\/\/ Stop the server on interrupt\r\nsignal.Notify(stop, os.Interrupt)\r\n\r\nsrv, err := run()\r\nif err != nil {\r\n\tlog.Fatal(err)\r\n}\r\n\r\nfmt.Println(\"Server running on\", srv.Addr)\r\n&lt;-stop\r\nlog.Println(\"Stopping server\")\r\nsrv.Shutdown(nil)<\/pre>\n<p><span style=\"font-weight: 400\">Esto crea una conexi\u00f3n con Couchbase Server y autentica usando el nombre de usuario y la contrase\u00f1a (estas propiedades pueden ser personalizadas modificando las propiedades en la parte superior del main.go). A continuaci\u00f3n abrimos una conexi\u00f3n a nuestro bucket. El resto de la funci\u00f3n es el manejo del servidor web. Creamos un canal a la escucha de la se\u00f1al de interrupci\u00f3n y cuando se dispara, cerramos el servidor http.<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\"><br \/>\n<\/span><span style=\"font-weight: 400\">Es dif\u00edcil visualizar y filtrar estos datos en la l\u00ednea de comandos, por lo que en el c\u00f3digo base vinculado hemos a\u00f1adido una sencilla interfaz gr\u00e1fica de usuario. El servidor web sirve la p\u00e1gina de \u00edndice y expone un \u00fanico punto final para recuperar datos din\u00e1micos. Una vez m\u00e1s, para ejecutar esto utilice <span class=\"lang:default decode:true crayon-inline\">go run main.go<\/span>\u00a0<\/span><span style=\"font-weight: 400\">\u00a0<\/span><span style=\"font-weight: 400\">y puede acceder al frontend desde <span class=\"lang:default decode:true crayon-inline\">https:\/\/localhost:8010<\/span>\u00a0<\/span><span style=\"font-weight: 400\">.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Nuestro manejador para el punto final de datos din\u00e1micos tiene este aspecto:<\/span><\/p>\n<pre class=\"lang:go decode:true\">func requestHandler(w http.ResponseWriter, r *http.Request) {\r\n\topts, err := processQueryString(r.URL.Query())\r\n\tif err != nil {\r\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\r\n\t\treturn\r\n\t}\r\n\r\n\tq := `select DATE_PART_STR(pickupDate, \"%s\") AS period, %s as aggregate FROM alltaxis`\r\n\tq += ` %s GROUP BY DATE_PART_STR(pickupDate, \"%s\") ORDER BY period;`\r\n\tq = fmt.Sprintf(q, opts.Period, opts.Aggregate, opts.Where, opts.Period)\r\n\tquery := gocb.NewAnalyticsQuery(q)\r\n\r\n\tresults, err := cluster.ExecuteAnalyticsQuery(query, opts.Params)\r\n\tif err != nil {\r\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\r\n\t\treturn\r\n\t}\r\n\r\n\tdata, err := processResults(results)\r\n\tif err != nil {\r\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\r\n\t\treturn\r\n\t}\r\n\r\n\tdata.Where = fmt.Sprintf(\"%s %s, %v\", opts.Aggregate, opts.Where, opts.Params)\r\n\tdata.Query = fmt.Sprintf(\"query = %s, params = %v\", q, opts.Params)\r\n\tdata.TimeTaken = results.Metrics().ExecutionTime.Nanoseconds()\r\n\tjs, err := json.Marshal(*data)\r\n\tif err != nil {\r\n\t\thttp.Error(w, err.Error(), http.StatusInternalServerError)\r\n\t\treturn\r\n\t}\r\n\r\n\tw.WriteHeader(200)\r\n\tw.Header().Set(\"Content-Type\", \"application\/json\")\r\n\tw.Write(js)\r\n}\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Lo que podemos ver aqu\u00ed es que procesamos la cadena de consulta para extraer el d\u00f3nde (m\u00e1s par\u00e1metros, m\u00e1s sobre esto m\u00e1s adelante), el agregado y el periodo de tiempo. Creamos nuestra consulta como una cadena, incorporando estas propiedades y luego usamos <span class=\"lang:default decode:true crayon-inline\">NewAnalyticsQuery<\/span>\u00a0<\/span><span style=\"font-weight: 400\">\u00a0<\/span><span style=\"font-weight: 400\">para crear un <span class=\"lang:default decode:true crayon-inline\">AnalyticsQuery<\/span>\u00a0<\/span><span style=\"font-weight: 400\">. Para ejecutar la consulta se pasa a <span class=\"lang:default decode:true crayon-inline\">cluster.ExecuteAnalyticsQuery<\/span>\u00a0<\/span><span style=\"font-weight: 400\">. <\/span><span style=\"font-weight: 400\">A continuaci\u00f3n, los resultados son procesados por <span class=\"lang:default decode:true crayon-inline\">procesarResultados<\/span>\u00a0<\/span><span style=\"font-weight: 400\">\u00a0antes de enviar la respuesta http. <span class=\"lang:default decode:true crayon-inline\">D\u00f3nde<\/span>\u00a0<\/span><span style=\"font-weight: 400\">,\u00a0<span class=\"lang:default decode:true crayon-inline\">TiempoTomado<\/span>\u00a0 <\/span><span style=\"font-weight: 400\">y\u00a0<\/span><span style=\"font-weight: 400\"> <span class=\"lang:default decode:true crayon-inline\">Consulta<\/span>\u00a0<\/span><span style=\"font-weight: 400\">\u00a0tambi\u00e9n se a\u00f1aden a la respuesta para que podamos mostrar lo que se ha consultado en el frontend. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Veamos cada una de estas partes con un poco m\u00e1s de detalle. Los par\u00e1metros where y aggregate se pasan desde el frontend ya formateados correctamente. La cadena de consulta podr\u00eda ser algo como <\/span><\/p>\n<p><span class=\"lang:default decode:true crayon-inline\">?period=hour&amp;month=5&amp;day=14&amp;aggregate=count(*)&amp;where=fareAmount,&gt;,15&amp;where=tip,&lt;,1<\/span><\/p>\n<p><span style=\"font-weight: 400\">Lo que ocurre aqu\u00ed es que el periodo dicta la granularidad de la consulta: un d\u00eda, un mes o el a\u00f1o entero. Para el caso en que estemos consultando un d\u00eda necesitamos saber tambi\u00e9n qu\u00e9 d\u00eda y qu\u00e9 mes, los par\u00e1metros mes y d\u00eda estar\u00e1n presentes o no dependiendo del periodo. El agregado es la operaci\u00f3n y el campo al que aplicar la operaci\u00f3n. En lugar de <span class=\"lang:default decode:true crayon-inline\">count(*)<\/span>\u00a0 podr\u00eda ser <span class=\"lang:default decode:true crayon-inline\">SUM(tips)<\/span>\u00a0 o <span class=\"lang:default decode:true crayon-inline\">AVG(fare)<\/span>\u00a0 etc... Los par\u00e1metros where son las cl\u00e1usulas where individuales a aplicar - se env\u00edan como matrices de la forma [campo, operador, valor].<\/span><\/p>\n<pre class=\"lang:go decode:true\">func whereTimePeriod(period string, query url.Values) string {\r\n\twhere := \"\"\r\n\tif period == \"day\" {\r\n\t\tmonth := query[\"month\"][0]\r\n\t\tif month == \"1\" {\r\n\t\t\twhere = `pickupDate &lt;= \"2016-01-31 23:59:59\"`\r\n\t\t} else if month == \"12\" {\r\n\t\t\twhere = `pickupDate &gt;= \"2016-12-01 00:00:00\"`\r\n\t\t} else {\r\n\t\t\tmonthInt, _ := strconv.ParseFloat(month, 64)\r\n\t\t\twhere = fmt.Sprintf(`pickupDate &gt;= \"2016-%02g-01T00:00:00\" AND pickupDate &lt;= \"2016-%02g-31T23:59:59\"`, monthInt, monthInt)\r\n\t\t}\r\n\t} else if period == \"hour\" {\r\n\t\tmonth := query[\"month\"][0]\r\n\t\tmonthInt, _ := strconv.ParseFloat(month, 64)\r\n\t\tday := query[\"day\"][0]\r\n\t\tdayInt, _ := strconv.ParseFloat(day, 64)\r\n\t\twhere = fmt.Sprintf(`pickupDate &gt; \"2016-%02g-%02gT00:00:00\" AND pickupDate &lt;= \"2016-%02g-%02gT23:59:59\"`, monthInt, dayInt, monthInt, dayInt)\r\n\t}\r\n\r\n\treturn where\r\n}\r\n<\/pre>\n<p><span style=\"font-weight: 400\">En <span class=\"lang:default decode:true crayon-inline\">whereTimePeriod<\/span>\u00a0<\/span><span style=\"font-weight: 400\">\u00a0<\/span><span style=\"font-weight: 400\">genera la parte temporal de la cl\u00e1usula where extrayendo el periodo de la cadena de consulta. Dependiendo del valor del par\u00e1metro periodo, se aplica una l\u00f3gica diferente para construir la cl\u00e1usula where, si se requiere el a\u00f1o completo, entonces se devuelve una cl\u00e1usula where vac\u00eda.<\/span><\/p>\n<pre class=\"lang:go decode:true\">func processQueryString(queryString url.Values) (*queryOptions, error) {\r\n\taggregate := queryString[\"aggregate\"][0]\r\n\tperiod := \"month\"\r\n\twhere := \"\"\r\n\tnumParams := 0\r\n\tvar params []interface{}\r\n\r\n\tif len(queryString[\"period\"]) &gt; 0 {\r\n\t\tperiod = queryString[\"period\"][0]\r\n\t\twhere = whereTimePeriod(period, queryString)\r\n\t}\r\n\r\n\tfor _, cond := range queryString[\"where\"] {\r\n\t\tnumParams++\r\n\t\tcondParts := strings.Split(cond, \",\")\r\n\t\tif len(where) &gt; 0 {\r\n\t\t\twhere = fmt.Sprintf(\"%s AND %s %s $%d\", where, condParts[0], condParts[1], numParams)\r\n\t\t} else {\r\n\t\t\twhere = fmt.Sprintf(\"%s %s $%d\", condParts[0], condParts[1], numParams)\r\n\t\t}\r\n\t\tval, err := strconv.Atoi(condParts[2])\r\n\t\tif err != nil {\r\n\t\t\treturn nil, err\r\n\t\t}\r\n\t\tparams = append(params, val)\r\n\t}\r\n\r\n\tif len(where) &gt; 0 {\r\n\t\twhere = fmt.Sprintf(\"WHERE %s\", where)\r\n\t}\r\n\r\n\treturn &amp;queryOptions{\r\n\t\tAggregate: aggregate,\r\n\t\tWhere:     where,\r\n\t\tPeriod:    period,\r\n\t\tParams:    params,\r\n\t}, nil\r\n}\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Una vez que la parte limitada en el tiempo se construye entonces cada uno de los par\u00e1metros where que el frontend ha proporcionado puede ser a\u00f1adido. Puedes ver que en lugar de incluir los valores where usando formato de cadena estamos usando par\u00e1metros de consulta. Esta es una buena pr\u00e1ctica para evitar inyecciones SQL.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Una vez ejecutada la consulta, el <span class=\"lang:default decode:true crayon-inline\">procesarResultados<\/span>\u00a0<\/span><span style=\"font-weight: 400\">\u00a0<\/span><span style=\"font-weight: 400\">se ejecuta la funci\u00f3n<\/span><\/p>\n<pre class=\"lang:go decode:true\">func processResults(results gocb.AnalyticsResults) (*calendarData, error) {\r\n\tvar row map[string]interface{}\r\n\tvar dateParts []float64\r\n\tvar aggregates []float64\r\n\tfor results.Next(&amp;row) {\r\n\t\tif datePart, ok := row[\"period\"]; ok {\r\n\t\t\tdateParts = append(dateParts, datePart.(float64))\r\n\t\t\taggregates = append(aggregates, row[\"aggregate\"].(float64))\r\n\t\t}\r\n\t}\r\n\tif err := results.Close(); err != nil {\r\n\t\treturn nil, err\r\n\t}\r\n\r\n\treturn &amp;calendarData{\r\n\t\tDateParts: dateParts,\r\n\t\tAggregate: aggregates,\r\n\t}, nil\r\n}\r\n<\/pre>\n<p><span style=\"font-weight: 400\">Itera sobre los resultados utilizando <span class=\"lang:default decode:true crayon-inline\">results.Next(&amp;row)<\/span>\u00a0<\/span><span style=\"font-weight: 400\">\u00a0<\/span><span style=\"font-weight: 400\">y, para cada resultado, extrae el periodo de tiempo al que corresponde el resultado en forma de n\u00famero, es decir, la hora (0-23), el d\u00eda (1-31) o el mes (1-12). Tambi\u00e9n extrae el valor agregado que corresponde a ese periodo de tiempo. Al final hay una llamada a <\/span><span style=\"font-weight: 400\">r<span class=\"lang:default decode:true crayon-inline\">esults.Close()<\/span>\u00a0<\/span><span style=\"font-weight: 400\">que comprueba si hay errores para asegurarse de que todos los datos se han le\u00eddo correctamente.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Utilizando el frontend podemos probar f\u00e1cilmente diferentes agregados para diferentes campos, aplicar cl\u00e1usulas where y profundizar en los datos para obtener una visi\u00f3n m\u00e1s granular de las cosas. Por ejemplo, probablemente queramos saber en qu\u00e9 mes generaron m\u00e1s dinero los taxis:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5886 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/10\/Screen-Shot-2018-10-08-at-12.17.52-1024x576.png\" alt=\"Chart with execution of sum fares query\" width=\"900\" height=\"506\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.17.52-1024x576.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.17.52-300x169.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.17.52-768x432.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.17.52-1536x864.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.17.52-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.17.52-1320x743.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.17.52.png 2048w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><span style=\"font-weight: 400\">Profundicemos en ello haciendo clic en el punto correspondiente a mayo:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5888 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/10\/Screen-Shot-2018-10-08-at-12.19.15-1024x568.png\" alt=\"Chart for query of sum fares for the month of May\" width=\"900\" height=\"499\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.19.15-1024x568.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.19.15-300x166.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.19.15-768x426.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.19.15-1536x852.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.19.15-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.19.15-1320x732.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.19.15.png 2048w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><span style=\"font-weight: 400\">Parece que la mayor parte del dinero se genera los fines de semana, eso tiene sentido. Como hace buen tiempo en mayo y los fines de semana son los m\u00e1s populares, \u00bfquiz\u00e1 la mayor\u00eda de los viajes son de varios pasajeros que van juntos a ver los monumentos?<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-5887 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/10\/Screen-Shot-2018-10-08-at-12.24.57-1024x574.png\" alt=\"Chart for the query of count * for the month of May where passengers is greater than 1\" width=\"900\" height=\"504\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.24.57-1024x574.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.24.57-300x168.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.24.57-768x431.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.24.57-1536x861.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.24.57-20x11.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.24.57-1320x740.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.24.57.png 2048w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><span style=\"font-weight: 400\">No lo parece. Podr\u00edamos hacer muchas otras comparaciones, como las tarifas frente a las propinas o el n\u00famero de viajes frente al n\u00famero de viajes sin propinas. Este conjunto de datos tambi\u00e9n contiene datos de localizaci\u00f3n, por lo que podr\u00edamos hacer cosas como crear mapas de calor de los lugares de recogida.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Conclusi\u00f3n<\/span><\/h2>\n<p><span style=\"font-weight: 400\">En este ejemplo, vimos c\u00f3mo una simple consulta, que incluso podr\u00eda ser ad-hoc, se puede utilizar para analizar r\u00e1pidamente un conjunto de datos con una variedad de m\u00e9tricas, todo ello sin necesidad de la creaci\u00f3n de \u00edndices. Couchbase Analytics a\u00f1adir\u00e1 esta gran capacidad a la plataforma Couchbase cuando est\u00e9 disponible de forma general. Los desarrolladores Golang tienen acceso ahora a trav\u00e9s de la beta 6.0.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Nos encantar\u00eda conocer su opini\u00f3n.  Por favor, <a href=\"https:\/\/www.couchbase.com\/blog\/es\/download\/\">descargar<\/a><\/span><span style=\"font-weight: 400\">\u00a0Couchbase Server 6.0 beta hoy y pruebe la versi\u00f3n actualizada de <a href=\"https:\/\/docs.couchbase.com\/server\/6.0\/analytics\/introduction.html\">An\u00e1lisis de Couchbase<\/a>.  Estaremos atentos a sus comentarios en <a href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/\">www.couchbase.com\/forums\/<\/a> sobre cualquier tema, desde an\u00e1lisis hasta el SDK de Go.<\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>This post illustrates the use of Couchbase Analytics with the Couchbase Go SDK. Couchbase Analytics is a new service available in Couchbase Server 6.0, you can read more at https:\/\/docs.couchbase.com\/server\/6.0\/analytics\/introduction.html. In this post we\u2019re going to use a real world [&hellip;]<\/p>","protected":false},"author":17480,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[2294,1820,1812,2201],"tags":[],"ppma_author":[8944],"class_list":["post-5885","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","category-golang","category-n1ql-query","category-tools-sdks"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>A Couchbase Analytics Example using the Go SDK<\/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\/a-couchbase-analytics-example-using-the-go-sdk\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A Couchbase Analytics Example using the Go SDK\" \/>\n<meta property=\"og:description\" content=\"This post illustrates the use of Couchbase Analytics with the Couchbase Go SDK. Couchbase Analytics is a new service available in Couchbase Server 6.0, you can read more at https:\/\/docs.couchbase.com\/server\/6.0\/analytics\/introduction.html. In this post we\u2019re going to use a real world [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/a-couchbase-analytics-example-using-the-go-sdk\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-10-11T19:04:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T04:20:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.17.52.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2048\" \/>\n\t<meta property=\"og:image:height\" content=\"1152\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Charles Dixon, Software Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Charles Dixon, Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/\"},\"author\":{\"name\":\"Charles Dixon, Senior Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/cd440eed5f00a0f702828c9f3697f6c3\"},\"headline\":\"A Couchbase Analytics Example using the Go SDK\",\"datePublished\":\"2018-10-11T19:04:19+00:00\",\"dateModified\":\"2025-06-14T04:20:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/\"},\"wordCount\":1520,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Couchbase Analytics\",\"GoLang\",\"SQL++ \/ N1QL Query\",\"Tools &amp; SDKs\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/\",\"name\":\"A Couchbase Analytics Example using the Go SDK\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2018-10-11T19:04:19+00:00\",\"dateModified\":\"2025-06-14T04:20:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A Couchbase Analytics Example using the Go SDK\"}]},{\"@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\/cd440eed5f00a0f702828c9f3697f6c3\",\"name\":\"Charles Dixon, Senior Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9cb6d8cbb9125a775db01b9a74258c36\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6359fe0ffc778647ed89c818c1474ac1151dae1fe4bf7315ad38a0ec92cfe9af?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6359fe0ffc778647ed89c818c1474ac1151dae1fe4bf7315ad38a0ec92cfe9af?s=96&d=mm&r=g\",\"caption\":\"Charles Dixon, Senior Software Engineer, Couchbase\"},\"description\":\"Charles Dixon is a Senior Software Engineer at Couchbase. He primarily works on the Couchbase Go SDK.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/charles-dixon\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Un ejemplo de Couchbase Analytics usando el SDK Go","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\/a-couchbase-analytics-example-using-the-go-sdk\/","og_locale":"es_MX","og_type":"article","og_title":"A Couchbase Analytics Example using the Go SDK","og_description":"This post illustrates the use of Couchbase Analytics with the Couchbase Go SDK. Couchbase Analytics is a new service available in Couchbase Server 6.0, you can read more at https:\/\/docs.couchbase.com\/server\/6.0\/analytics\/introduction.html. In this post we\u2019re going to use a real world [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/a-couchbase-analytics-example-using-the-go-sdk\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-10-11T19:04:19+00:00","article_modified_time":"2025-06-14T04:20:30+00:00","og_image":[{"width":2048,"height":1152,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/10\/Screen-Shot-2018-10-08-at-12.17.52.png","type":"image\/png"}],"author":"Charles Dixon, Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Charles Dixon, Software Engineer, Couchbase","Est. reading time":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/"},"author":{"name":"Charles Dixon, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/cd440eed5f00a0f702828c9f3697f6c3"},"headline":"A Couchbase Analytics Example using the Go SDK","datePublished":"2018-10-11T19:04:19+00:00","dateModified":"2025-06-14T04:20:30+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/"},"wordCount":1520,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Couchbase Analytics","GoLang","SQL++ \/ N1QL Query","Tools &amp; SDKs"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/","url":"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/","name":"Un ejemplo de Couchbase Analytics usando el SDK Go","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2018-10-11T19:04:19+00:00","dateModified":"2025-06-14T04:20:30+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/a-couchbase-analytics-example-using-the-go-sdk\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"A Couchbase Analytics Example using the Go SDK"}]},{"@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\/cd440eed5f00a0f702828c9f3697f6c3","name":"Charles Dixon, Ingeniero Superior de Software, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/9cb6d8cbb9125a775db01b9a74258c36","url":"https:\/\/secure.gravatar.com\/avatar\/6359fe0ffc778647ed89c818c1474ac1151dae1fe4bf7315ad38a0ec92cfe9af?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6359fe0ffc778647ed89c818c1474ac1151dae1fe4bf7315ad38a0ec92cfe9af?s=96&d=mm&r=g","caption":"Charles Dixon, Senior Software Engineer, Couchbase"},"description":"Charles Dixon is a Senior Software Engineer at Couchbase. He primarily works on the Couchbase Go SDK.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/charles-dixon\/"}]}},"authors":[{"term_id":8944,"user_id":17480,"is_guest":0,"slug":"charles-dixon","display_name":"Charles Dixon, Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/6359fe0ffc778647ed89c818c1474ac1151dae1fe4bf7315ad38a0ec92cfe9af?s=96&d=mm&r=g","author_category":"","last_name":"Dixon, Software Engineer, Couchbase","first_name":"Charles","job_title":"","user_url":"","description":"Charles Dixon es Ingeniero de Software en Couchbase. Trabaja en el SDK de Couchbase Go."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5885","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\/17480"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=5885"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/5885\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=5885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=5885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=5885"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=5885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}