{"id":7085,"date":"2019-06-18T08:03:34","date_gmt":"2019-06-18T15:03:34","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=7085"},"modified":"2023-05-19T04:35:50","modified_gmt":"2023-05-19T11:35:50","slug":"couchbase-scala-sdk","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-scala-sdk\/","title":{"rendered":"Presentaci\u00f3n del SDK Scala de Couchbase"},"content":{"rendered":"<p>Estoy muy contento de informar que Couchbase ahora tiene un SDK Scala soportado, lo que le permite obtener y recuperar documentos, ejecutar consultas N1QL, realizar an\u00e1lisis y b\u00fasquedas de texto completo - todo con Scala nativo.<\/p>\n<p>En este blog voy a tocar las caracter\u00edsticas clave y los principios de dise\u00f1o del SDK de Scala.  O si quieres ponerte en marcha de inmediato, entonces echa un vistazo a la <a href=\"https:\/\/docs.couchbase.com\/scala-sdk\/1.0\/start-using-sdk.html\">gu\u00eda de iniciaci\u00f3n aqu\u00ed<\/a>.  El SDK de Scala puede descargarse ahora mismo, en forma de versi\u00f3n alfa previa.<\/p>\n<p>El SDK de Scala utiliza el mismo n\u00facleo interno estable y de alto rendimiento que el nuevo SDK de Java 3.x, por lo que, aunque es nuevo, puede estar seguro de que estar\u00e1 listo para la producci\u00f3n cuando llegue GA.<\/p>\n<h3><b>Tratamiento funcional de errores: \u00a1sin excepciones!<\/b><\/h3>\n<p>El SDK de Scala presenta una interfaz funcional, con la mayor\u00eda de las operaciones devolviendo un Try de Scala.  Esto puede ser un \u00c9xito y contener el valor esperado, o un Fallo conteniendo un Throwable. Aunque al principio esto parece un poco verboso, y requiere cierta disciplina de programaci\u00f3n para manejar siempre los errores, esta forma de manejo de errores se convierte r\u00e1pidamente en una segunda naturaleza y le permite desarrollar con la seguridad de que una excepci\u00f3n aleatoria no va a ser lanzada desde el SDK.<\/p>\n<p>Aqu\u00ed tienes una sencilla demostraci\u00f3n de c\u00f3mo insertar un documento:<\/p>\n<pre class=\"lang:scala decode:true\">val json = JsonObject(\"status\" -&gt; \"awesome!\")\r\n\r\nval result: Try[MutationResult] = collection.insert(\"document-key\", json)<\/pre>\n<p>Y luego la concordancia de patrones en el resultado de Try:<\/p>\n<pre class=\"lang:scala decode:true\">result match {\r\n \u00a0\u00a0\u00a0 case Success(mr) =&gt; println(\"Upsert was successful\")\r\n \u00a0\u00a0\u00a0 case Failure(err: KeyAlreadyExistsException) =&gt; println(\"document-key already exists\") \r\n \u00a0\u00a0\u00a0 case Failure(err) =&gt; println(\"Error: \" + err)\r\n}<\/pre>\n<p>(Por supuesto, una aplicaci\u00f3n de producci\u00f3n gestionar\u00eda los errores adecuadamente, en lugar de limitarse a utilizar println).<\/p>\n<p>Si prefieres tener algo similar al SDK de Java, que lanza excepciones, esto es f\u00e1cil de simular simplemente llamando a .get() en cualquier Try, que lanzar\u00e1 si es un Failure:<\/p>\n<pre class=\"lang:scala decode:true\">val result: MutationResult = collection.insert(\"document-key\", json).get()<\/pre>\n<p>Es f\u00e1cil combinar m\u00faltiples Try's a trav\u00e9s de flatMap.  Aqu\u00ed insertamos un documento, luego lo obtenemos, recuperamos su contenido convertido a la librer\u00eda JSON JsonObjectSafe (m\u00e1s sobre esto m\u00e1s adelante), y finalmente obtenemos un campo llamado \"status\" a partir de \u00e9l.  Todo en un estilo completamente funcional, as\u00ed que por ejemplo la operaci\u00f3n get s\u00f3lo se intentar\u00e1 si el upsert tiene \u00e9xito.<\/p>\n<pre class=\"lang:scala decode:true\">val result: Try[String] = collection.upsert(\"document-key\", json)\r\n    .flatMap(_ =&gt; collection.get(\"document-key\"))\r\n    .flatMap(_.contentAs[JsonObjectSafe])\r\n    .flatMap(_.str(\"status\"))\r\n\r\nresult match {\r\n    case Success(status) =&gt; println(s\"Couchbase is $status\")\r\n    case Failure(err) =&gt;\u00a0\u00a0\u00a0 println(\"Error: \" + err)\r\n}<\/pre>\n<p>(En aras de la concisi\u00f3n, en la mayor\u00eda de los ejemplos no se comprobar\u00e1 el resultado.  Pero las aplicaciones de producci\u00f3n deber\u00edan, por supuesto, ABC - siempre comprobarlo).<\/p>\n<h3><b>Previsi\u00f3n<\/b><\/h3>\n<p>Fuera de la caja, el SDK soporta la nueva durabilidad m\u00e1s fuerte que estar\u00e1 disponible en Couchbase Server 6.5:<\/p>\n<pre class=\"lang:scala decode:true\">val result = collection.upsert(\u201cdocId\u201d, json, durability = Durability.Majority)<\/pre>\n<p>E incorpora soporte para colecciones, un nuevo m\u00e9todo de organizar documentos dentro de cubos que ser\u00e1 una caracter\u00edstica fundamental de una futura versi\u00f3n de Couchbase Server (con una vista previa en breve).  Pronto se podr\u00e1n crear algunas colecciones de juguete con las que jugar, pero por ahora bastar\u00e1 con abrir la colecci\u00f3n por defecto:<\/p>\n<pre class=\"lang:scala decode:true\">val cluster = Cluster.connect(\"cluster-ip\", \"username\", \"password\")\r\nval collection = cluster.bucket(\"bucket-name\").defaultCollection<\/pre>\n<p>Esta l\u00f3gica funcionar\u00e1 en todas las versiones soportadas de Couchbase Server (5.x y superiores).<\/p>\n<p>Adem\u00e1s, se incluye compatibilidad con OpenTracing (ahora OpenTelemetry), la plataforma que se est\u00e1 convirtiendo en el est\u00e1ndar de facto para rastrear sistemas distribuidos complejos:<\/p>\n<pre class=\"lang:scala decode:true\">val result = collection.upsert(\u201cdocId\u201d, json, parentSpan = Some(mySpan))<\/pre>\n<h3><b>API simple<\/b><\/h3>\n<p>El SDK utiliza par\u00e1metros con nombre y por defecto en lugar de sobrecargas, por lo que el c\u00f3digo puede ser muy sencillo:<\/p>\n<pre class=\"lang:scala decode:true\">val result = collection.upsert(\u201cdocId\u201d, json)<\/pre>\n<p>o a medida:<\/p>\n<pre class=\"lang:scala decode:true\">val result = collection.upsert(\u201cdocId\u201d, json, durability = Durability.Majority, expiration = 60.minutes, parentSpan = Some(mySpan))<\/pre>\n<p>como usted necesita que sea.<\/p>\n<h3><b>As\u00edncrono<\/b><\/h3>\n<p>Al igual que el SDK de Java, se presentan tres API, que le ofrecen la flexibilidad necesaria para estructurar su aplicaci\u00f3n de la forma que necesite.<\/p>\n<p>La primera es la API sincr\u00f3nica de bloqueo simple que has visto en los ejemplos anteriores.  Esta puede ser una buena opci\u00f3n por defecto, pero por supuesto requiere que gestiones expl\u00edcitamente tus propios hilos si es necesario.<\/p>\n<p>El segundo es uno construido en torno a la programaci\u00f3n reactiva, utilizando tipos reactivos est\u00e1ndar (Mono y Flux) del Proyecto Reactor.<\/p>\n<p>Un ejemplo de upserting de forma reactiva:<\/p>\n<pre class=\"lang:scala decode:true\">val mono: Mono[MutationResult] = collection.reactive.upsert(\"document-key\", json)\r\n    .doOnError(err =&gt; println(s\"Error during upsert: ${err}\"))\r\n    .doOnNext(mutationResult =&gt; println(\"Success\"))<\/pre>\n<p>Con la programaci\u00f3n reactiva, no ocurrir\u00e1 nada hasta que nos suscribamos al Mono.  La forma m\u00e1s sencilla de hacer esto con fines de prueba es utilizar block(), aunque esto es una mala pr\u00e1ctica para una aplicaci\u00f3n real:<\/p>\n<pre class=\"lang:scala decode:true\">val result: MutationResult = mono.block()<\/pre>\n<p>La programaci\u00f3n reactiva es un tema complejo y profundo en el que no puedo profundizar demasiado aqu\u00ed, pero cuando se domina proporciona una herramienta poderosa, especialmente para manejar las complejidades de los sistemas distribuidos del mundo real.  En particular, la API reactiva proporciona backpressure en N1QL, FTS y consultas anal\u00edticas - por lo que si la aplicaci\u00f3n est\u00e1 luchando para mantenerse al d\u00eda con los datos, se ralentizar\u00e1 autom\u00e1ticamente el consumo de filas y evitar errores fuera de memoria.  Animo a los curiosos a echar un vistazo a la <a href=\"https:\/\/projectreactor.io\/docs\">Documentaci\u00f3n del proyecto Reactor<\/a> para saber m\u00e1s.<\/p>\n<p>Por \u00faltimo, est\u00e1 la API as\u00edncrona construida alrededor de Scala Futures, que proporciona un poco de la gesti\u00f3n de hilos y composabilidad de la programaci\u00f3n reactiva, pero en una forma que es m\u00e1s familiar para muchos desarrolladores Scala.  Un ejemplo simple de upsert se ve as\u00ed:<\/p>\n<pre class=\"lang:default decode:true\">val result: Future[MutationResult] = collection.async.upsert(\"document-key\", json)\r\n\r\nresult onComplete {\r\n    case Success(_) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 =&gt; println(\"Successfully upserted\")\r\n    case Failure(exception) =&gt; println(\"Error: \" + exception)\r\n}<\/pre>\n<h3><b>Flexibilidad JSON<\/b><\/h3>\n<p>Uno de los principales objetivos era no ce\u00f1irte a ninguna implementaci\u00f3n JSON en particular, y el SDK de Scala funciona bien con varias librer\u00edas JSON populares de Scala, incluyendo Circe, \u00b5Pickle \/ \u00b5Json, Json4s y Jawn.  Puedes ver fragmentos de c\u00f3mo usar cada una de ellas en <a href=\"https:\/\/docs.couchbase.com\/scala-sdk\/1.0\/howtos\/json.html\">los documentos JSON<\/a>Pero para abrir el apetito, aqu\u00ed tiene Circe en acci\u00f3n: observe c\u00f3mo los tipos Circe se env\u00edan y devuelven directamente al SDK:<\/p>\n<pre class=\"lang:scala decode:true\">import io.circe.generic.auto._\r\nimport io.circe.syntax._\r\n\r\nval user = User(\u201cJohn Smith\u201d, 29)\r\nval json: io.circe.Json = user.asJson\r\n\r\nval result: Try[io.circe.Json] = collection.insert(\"id\", json)\r\n    .flatMap(_ =&gt; collection.get(\"id\"))\r\n     .flatMap(doc =&gt; doc.contentAs[io.circe.Json])\r\n\r\nresult match {\r\n    case Success(content: io.circe.Json) =&gt;\r\n        \/\/ Handle Circe Json here\r\n    case Failure(err) =&gt;\u00a0\u00a0\u00a0 println(\"Error: \" + err)\r\n}<\/pre>\n<h4>JSON integrado<\/h4>\n<p>Tomando un enfoque de \"pilas incluidas\" tambi\u00e9n hay una sencilla biblioteca JSON incluida con el SDK, JsonObject.  Sus principales objetivos son:<\/p>\n<ul>\n<li>Comodidad. No todo el mundo quiere evaluar m\u00faltiples librer\u00edas JSON antes de empezar. JsonObject es una opci\u00f3n decente por defecto.<\/li>\n<li>Velocidad. Nuestra evaluaci\u00f3n comparativa interna (<a href=\"https:\/\/github.com\/couchbase\/couchbase-jvm-clients\/tree\/master\/benchmarks\">fuente<\/a> en caso de que quieras comprobarlo por ti mismo) indica que JsonObject puede ser hasta 20 veces m\u00e1s r\u00e1pido que la biblioteca JSON de Scala m\u00e1s cercana en algunas operaciones importantes. Esto se consigue sobre todo gracias a que est\u00e1 construido en torno a estructuras de datos JVM mutables, sencillas pero muy r\u00e1pidas.<\/li>\n<li>Flexibilidad.  La interfaz JsonObject por defecto lanza excepciones (el \u00fanico lugar en el SDK que lo hace).  O puedes convertirla f\u00e1cilmente en una JsonObjectSafe, que proporciona una interfaz funcional basada en Try.<\/li>\n<li>Facilidad de uso y mutabilidad. Estamos de acuerdo con<a href=\"https:\/\/www.lihaoyi.com\/post\/uJsonfastflexibleandintuitiveJSONforScala.html\"> el autor de \u00b5Json<\/a> que aunque la inmutabilidad suele ser deseable, no siempre es la mejor opci\u00f3n en el caso particular de JSON. Tratar con JSON profundamente anidado requiere herramientas funcionales como lentes, que rara vez son f\u00e1ciles de leer y utilizar, por no mencionar que posiblemente incurran en una penalizaci\u00f3n de rendimiento. Adem\u00e1s, JSON suele tratarse brevemente y en un \u00e1mbito limitado (por ejemplo, obteniendo y modificando un documento), por lo que rara vez se beneficia de la seguridad de la inmutabilidad. As\u00ed que JsonObject presenta una API mutable simple.<\/li>\n<\/ul>\n<p>Puede profundizar en la <a href=\"https:\/\/docs.couchbase.com\/scala-sdk\/1.0\/howtos\/json.html#jsonobject-and-jsonarray\">Documentaci\u00f3n sobre JsonObject<\/a>.  Por supuesto, si prefieres tener una librer\u00eda JSON m\u00e1s 't\u00edpicamente Scala' con datos inmutables, tipos de datos algebraicos, lentes, cursores y otras bondades funcionales, entonces una de las otras librer\u00edas soportadas puede ser una mejor elecci\u00f3n - la elecci\u00f3n es tuya, y puedes f\u00e1cilmente mezclar y combinar m\u00faltiples librer\u00edas JSON en la misma aplicaci\u00f3n.<\/p>\n<h4><b>Apoyo directo a las clases de casos<\/b><\/h4>\n<p>Aunque el SDK de Scala tiene un gran soporte para JSON, a veces es m\u00e1s f\u00e1cil y preferible trabajar directamente con las clases de casos de Scala.<\/p>\n<p>Con s\u00f3lo a\u00f1adir este peque\u00f1o trozo de boilerplate para tu clase case, el SDK puede generar autom\u00e1ticamente la l\u00f3gica de serializaci\u00f3n:<\/p>\n<pre class=\"lang:scala decode:true\">case class User(name: String, age: Int)\r\n\r\nobject User {\r\n    implicit val codec: Codec[User] = Codecs.codec[User]\r\n}<\/pre>\n<p>Y entonces usted puede f\u00e1cilmente enviar esa clase de caso directamente a, y recibirla de vuelta de, el SDK:<\/p>\n<pre class=\"lang:default decode:true\">val r: Try[User] = collection.insert(\u201cdocId\u201d, User(\u201cJohn Smith\u201d, 29))\r\n    .flatMap(_ =&gt; collection.get(\u201cdocId\u201d)\r\n    .flatMap(doc =&gt; doc.contentAs[User])<\/pre>\n<p>Bajo el cap\u00f3 esto se convierte y se almacena en Couchbase Server como el JSON que usted esperar\u00eda:<\/p>\n<pre class=\"lang:default decode:true\">{\"name\":\"John Smith\",\"age\":29}<\/pre>\n<p>Se trata de JSON normal y corriente, sin metadatos de serializaci\u00f3n adicionales o similares, por lo que puede escribirse libremente como una clase de caso y leerse en una biblioteca JSON o por otro SDK, o viceversa.<\/p>\n<p>Echa un vistazo a la <a href=\"https:\/\/docs.couchbase.com\/scala-sdk\/1.0\/howtos\/json.html#case-classes\">documentaci\u00f3n sobre el uso de clases de casos<\/a> para saber m\u00e1s.<\/p>\n<h3><b>Consultas sencillas<\/b><\/h3>\n<p>Hemos facilitado al m\u00e1ximo el uso de Couchbase Analytics, N1QL y Full Text Search.  Aqu\u00ed hay un ejemplo de una consulta N1QL donde las filas se convierten en JsonObject.<\/p>\n<pre class=\"lang:default decode:true\">cluster.query(\"\"\"select * from `travel-sample` limit 10;\"\"\")\r\n    .flatMap(_.allRowsAs[JsonObject]) match {\r\n\r\n    case Success(rows: Seq[JsonObject]) =&gt;\r\n        rows.foreach(row =&gt; println(row))\r\n    case Failure(err) =&gt;\r\n        println(s\"Error: $err\")\r\n}<\/pre>\n<p>Y por supuesto es posible obtener esos resultados como cualquiera de los tipos JSON soportados arriba, o directamente como clases de casos Scala.<\/p>\n<p>Y como ya se ha mencionado, el uso de la API reactiva significa que se obtiene backpressure autom\u00e1tico de forma gratuita, lo que garantiza que la aplicaci\u00f3n consuma filas a un ritmo manejable y no pueda encontrarse con problemas de falta de memoria en consultas muy grandes.<\/p>\n<p>&nbsp;<\/p>\n<p>Si quieres empezar a utilizar el SDK Scala de Couchbase, echa un vistazo a la secci\u00f3n <a href=\"https:\/\/docs.couchbase.com\/scala-sdk\/1.0\/start-using-sdk.html\">gu\u00eda de inicio r\u00e1pido<\/a>.  Ya est\u00e1 disponible, aunque en fase alfa.  Puede que haya algunos cambios de \u00faltima hora antes de pasar a GA, pero por otro lado este es el momento perfecto para probarlo y darnos tu opini\u00f3n dejando un comentario a continuaci\u00f3n, o plante\u00e1ndolo en <a href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/\">nuestros foros<\/a>, <a href=\"https:\/\/twitter.com\/couchbase\">Twitter<\/a> o <a href=\"https:\/\/gitter.im\/couchbase\/discuss?source=orgpage\">gitter<\/a>.  Nada es inamovible y agradecemos la oportunidad de hacer algunos cambios y convertirlo en el mejor SDK posible.<\/p>","protected":false},"excerpt":{"rendered":"<p>I\u2019m very happy to report that Couchbase now has a supported Scala SDK, allowing you to get and fetch documents, run N1QL queries, perform analytics and full text search lookups &#8211; all with native Scala. In this blog I\u2019m going [&hellip;]<\/p>","protected":false},"author":40102,"featured_media":7088,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[2201],"tags":[],"ppma_author":[9084],"class_list":["post-7085","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tools-sdks"],"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>Introducing the Couchbase Scala SDK - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"The Scala SDK is available to download, in a pre-release alpha form. Learn more about the key features and design principles of the Scala SDK.\" \/>\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-scala-sdk\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing the Couchbase Scala SDK\" \/>\n<meta property=\"og:description\" content=\"The Scala SDK is available to download, in a pre-release alpha form. Learn more about the key features and design principles of the Scala SDK.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-scala-sdk\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-06-18T15:03:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-05-19T11:35:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/06\/scala_and_couchbase.png\" \/>\n\t<meta property=\"og:image:width\" content=\"666\" \/>\n\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Graham Pople, Senior 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=\"Graham Pople, Senior Software Engineer, 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\/couchbase-scala-sdk\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/\"},\"author\":{\"name\":\"Graham Pople, Senior Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/40b3fd994e3f33a8068e54e36577eb8e\"},\"headline\":\"Introducing the Couchbase Scala SDK\",\"datePublished\":\"2019-06-18T15:03:34+00:00\",\"dateModified\":\"2023-05-19T11:35:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/\"},\"wordCount\":1417,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png\",\"articleSection\":[\"Tools &amp; SDKs\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/\",\"name\":\"Introducing the Couchbase Scala SDK - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png\",\"datePublished\":\"2019-06-18T15:03:34+00:00\",\"dateModified\":\"2023-05-19T11:35:50+00:00\",\"description\":\"The Scala SDK is available to download, in a pre-release alpha form. Learn more about the key features and design principles of the Scala SDK.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png\",\"width\":666,\"height\":350},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing the Couchbase Scala 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\/40b3fd994e3f33a8068e54e36577eb8e\",\"name\":\"Graham Pople, Senior Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/d0840b7ec045a43a30d21b57fa29318b\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4084d00daa868b9b163191a655774c94b21629bbeecd00916470d9d9878462a7?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4084d00daa868b9b163191a655774c94b21629bbeecd00916470d9d9878462a7?s=96&d=mm&r=g\",\"caption\":\"Graham Pople, Senior Software Engineer, Couchbase\"},\"description\":\"Graham is a senior software engineer at Couchbase who works on the SDK and Connectors team, mainly on the Scala and Java clients. Make his day by asking him about home composting.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/grahamp\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Introducing the Couchbase Scala SDK - The Couchbase Blog","description":"El SDK de Scala est\u00e1 disponible para su descarga, en una versi\u00f3n alfa preliminar. Obtenga m\u00e1s informaci\u00f3n sobre las caracter\u00edsticas principales y los principios de dise\u00f1o del SDK de Scala.","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-scala-sdk\/","og_locale":"es_MX","og_type":"article","og_title":"Introducing the Couchbase Scala SDK","og_description":"The Scala SDK is available to download, in a pre-release alpha form. Learn more about the key features and design principles of the Scala SDK.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/couchbase-scala-sdk\/","og_site_name":"The Couchbase Blog","article_published_time":"2019-06-18T15:03:34+00:00","article_modified_time":"2023-05-19T11:35:50+00:00","og_image":[{"width":666,"height":350,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/06\/scala_and_couchbase.png","type":"image\/png"}],"author":"Graham Pople, Senior Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Graham Pople, Senior Software Engineer, Couchbase","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/"},"author":{"name":"Graham Pople, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/40b3fd994e3f33a8068e54e36577eb8e"},"headline":"Introducing the Couchbase Scala SDK","datePublished":"2019-06-18T15:03:34+00:00","dateModified":"2023-05-19T11:35:50+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/"},"wordCount":1417,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png","articleSection":["Tools &amp; SDKs"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/","name":"Introducing the Couchbase Scala SDK - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png","datePublished":"2019-06-18T15:03:34+00:00","dateModified":"2023-05-19T11:35:50+00:00","description":"El SDK de Scala est\u00e1 disponible para su descarga, en una versi\u00f3n alfa preliminar. Obtenga m\u00e1s informaci\u00f3n sobre las caracter\u00edsticas principales y los principios de dise\u00f1o del SDK de Scala.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/06\/scala_and_couchbase.png","width":666,"height":350},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-scala-sdk\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introducing the Couchbase Scala 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\/40b3fd994e3f33a8068e54e36577eb8e","name":"Graham Pople, Ingeniero Superior de Software, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/d0840b7ec045a43a30d21b57fa29318b","url":"https:\/\/secure.gravatar.com\/avatar\/4084d00daa868b9b163191a655774c94b21629bbeecd00916470d9d9878462a7?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4084d00daa868b9b163191a655774c94b21629bbeecd00916470d9d9878462a7?s=96&d=mm&r=g","caption":"Graham Pople, Senior Software Engineer, Couchbase"},"description":"Graham is a senior software engineer at Couchbase who works on the SDK and Connectors team, mainly on the Scala and Java clients. Make his day by asking him about home composting.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/grahamp\/"}]}},"authors":[{"term_id":9084,"user_id":40102,"is_guest":0,"slug":"grahamp","display_name":"Graham Pople, Senior Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/4084d00daa868b9b163191a655774c94b21629bbeecd00916470d9d9878462a7?s=96&d=mm&r=g","author_category":"","last_name":"Pople, Senior Software Engineer, Couchbase","first_name":"Graham","job_title":"","user_url":"","description":"Graham es un ingeniero de software senior en Couchbase que trabaja en el equipo de SDK y Conectores, principalmente en los clientes Scala y Java.  Al\u00e9grale el d\u00eda pregunt\u00e1ndole por el compostaje casero."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/7085","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\/40102"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=7085"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/7085\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/7088"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=7085"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=7085"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=7085"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=7085"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}