{"id":13556,"date":"2022-07-13T10:09:45","date_gmt":"2022-07-13T17:09:45","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=13556"},"modified":"2025-06-13T17:20:45","modified_gmt":"2025-06-14T00:20:45","slug":"from-n1ql-to-javascript-and-back-part-1-introduction","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-1-introduction\/","title":{"rendered":"De N1QL a Javascript y viceversa - Parte 1: Introducci\u00f3n"},"content":{"rendered":"<p><b>Entre las muchas grandes caracter\u00edsticas introducidas en Couchbase Server 7.0<\/b><span style=\"font-weight: 400;\">Uno de ellos tiene el potencial de tener un mayor impacto en versiones posteriores: N1QL Funciones Definidas por el Usuario.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Una r\u00e1pida mirada al pasado<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">N1QL es un lenguaje declarativo, lo que significa que las peticiones se limitan a indicar <\/span><i><span style=\"font-weight: 400;\">qu\u00e9<\/span><\/i><span style=\"font-weight: 400;\"> que necesita el usuario, sin necesidad de especificar nunca <\/span><i><span style=\"font-weight: 400;\">c\u00f3mo<\/span><\/i><span style=\"font-weight: 400;\"> la solicitud debe llevarse a cabo.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Esto ha funcionado muy bien para los lenguajes de consulta, aunque con la limitaci\u00f3n de la falta de l\u00f3gica empresarial a medida.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Las funciones definidas por el usuario cubren ese vac\u00edo.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">La vista completa de UDFs en Couchbase Server 7.0 est\u00e1 disponible en <\/span><a href=\"https:\/\/www.couchbase.com\/blog\/es\/n1ql-user-defined-functions\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">este blog<\/span><\/a><span style=\"font-weight: 400;\">...pero para evitar saltos de un lado a otro, recordar\u00e9 r\u00e1pidamente algunas cosas importantes:<\/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;\">Las UDF est\u00e1n disponibles en varios lenguajes. En este blog nos interesa especialmente JavaScript.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Las FDU son de dos tipos: de cl\u00faster amplio (o <\/span><i><span style=\"font-weight: 400;\">global<\/span><\/i><span style=\"font-weight: 400;\"> UDFs), \u00fatil cuando a\u00fan no se han adoptado las colecciones, y scope bound (o <\/span><i><span style=\"font-weight: 400;\">alcance<\/span><\/i><span style=\"font-weight: 400;\"> UDFs), que permiten tener varias copias de la misma UDF (una por \u00e1mbito), pero cada una con una l\u00f3gica potencialmente diferente.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">N1QL no ofrece sobrecarga UDF (tener m\u00faltiples UDFs con el mismo nombre y diferente firma, cada una soportando l\u00f3gica espec\u00edfica para su entrada), pero la misma funcionalidad puede ser alcanzada con UDFs vari\u00e1dicas.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Las UDFs de N1QL pueden generar datos din\u00e1micos que pueden ser utilizados como fuente para las consultas N1QL.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3><span style=\"font-weight: 400;\">UDF de JavaScript<\/span><\/h3>\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;\">JavaScript es un <\/span><i><span style=\"font-weight: 400;\">externo<\/span><\/i><span style=\"font-weight: 400;\"> lo que significa que la gesti\u00f3n y ejecuci\u00f3n de las librer\u00edas JavaScript se delega en una entidad distinta del servicio N1QL. Esta entidad se denomina<\/span><i><span style=\"font-weight: 400;\"> jsevaluator.<\/span><\/i><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">La creaci\u00f3n de funciones JavaScript es un proceso de dos pasos: en primer lugar se crea el c\u00f3digo javascript propiamente dicho mediante la funci\u00f3n <\/span><i><span style=\"font-weight: 400;\">jsevaluator<\/span><\/i><span style=\"font-weight: 400;\"> y, a continuaci\u00f3n, se crea la UDF N1QL que hace referencia a ella.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Una de las ventajas secundarias de que el c\u00f3digo se mantenga externamente es que varias UDF pueden compartir la misma biblioteca y, por tanto, el mismo c\u00f3digo, y todas se actualizan al mismo tiempo cuando cambia el c\u00f3digo: las bibliotecas compartidas pueden ir a la par que su aplicaci\u00f3n, a diferencia del esquema de alcance.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">En la versi\u00f3n 7.0 <\/span><i><span style=\"font-weight: 400;\">jsevaluator<\/span><\/i><span style=\"font-weight: 400;\"> s\u00f3lo admite JavaScript plano.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3><span style=\"font-weight: 400;\">Los bits que faltan<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">El jsevaluator no soporta estados globales - ya que, como hemos visto, la misma librer\u00eda puede ser utilizada por m\u00faltiples peticiones concurrentemente a trav\u00e9s del servicio de consulta: guardar y recuperar valores en variables globales llevar\u00eda a resultados inesperados.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">El efecto secundario de esto es que las funciones de flecha globales no son compatibles, ya que la referencia de la funci\u00f3n se guarda en una variable global.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Las funciones de flecha locales (las declaradas dentro de cuerpos de funciones globales) funcionan como se espera.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Un ejemplo real<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Primero cree la biblioteca y la funci\u00f3n JavaScript:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">curl -v -X POST https:\/\/localhost:8093\/evaluator\/v1\/libraries\/math \\\r\n     -u Administrador:contrase\u00f1a\r\n     -d 'function add(a, b) { let data = a + b; return data; }'<\/pre>\n<p><span style=\"font-weight: 400;\">A continuaci\u00f3n, cree la UDF N1QL:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">cbq&gt; CREATE FUNCTION javascriptAdd(a, b) LANGUAGE javascript AS \"add\" AT \"math\";<\/pre>\n<p><span style=\"font-weight: 400;\">Tenga en cuenta que es perfectamente leg\u00edtimo crear primero la UDF y despu\u00e9s la biblioteca, pero, hasta que no cree la biblioteca, \u00a1no podr\u00e1 ejecutar la UDF!<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Novedad en 7.1<\/span><\/h2>\n<h3><span style=\"font-weight: 400;\">Interfaz de usuario<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Ya no tienes que preocuparte de extra\u00f1os endpoints REST y comandos curl para manipular librer\u00edas javascript: la aplicaci\u00f3n <em>Consulta<\/em> tiene una nueva pesta\u00f1a, <em>UDF<\/em>:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13557\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/new-couchbase-UDF-UI-console-1024x359.png\" alt=\"New UDF page in Couchbase UI\" width=\"900\" height=\"316\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/new-couchbase-UDF-UI-console-1024x359.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/new-couchbase-UDF-UI-console-300x105.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/new-couchbase-UDF-UI-console-768x269.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/new-couchbase-UDF-UI-console-1536x538.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/new-couchbase-UDF-UI-console-800x280.png 800w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/new-couchbase-UDF-UI-console-20x7.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/new-couchbase-UDF-UI-console-1320x462.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/new-couchbase-UDF-UI-console.png 1999w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Al pulsarlo se muestran listas de librer\u00edas JavaScript y definiciones UDF de N1QL:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13558\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/image3-1-1024x340.png\" alt=\"Manage UDFs and JavaScript functions in UI\" width=\"900\" height=\"299\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image3-1-1024x340.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image3-1-300x99.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image3-1-768x255.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image3-1-1536x509.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image3-1-20x7.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image3-1-1320x438.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image3-1.png 1999w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Hay botones para a\u00f1adir y editar tanto bibliotecas JavaScript como Funciones Definidas por el Usuario N1QL.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Lo importante es tener en cuenta que se est\u00e1n editando o a\u00f1adiendo bibliotecas, no funciones individuales: para a\u00f1adir una nueva funci\u00f3n a una biblioteca JavaScript, debe editarse toda la biblioteca y volver a enviarse con todas las funciones existentes y la nueva funci\u00f3n (si s\u00f3lo se env\u00eda la nueva funci\u00f3n, se borrar\u00e1n las funciones existentes, as\u00ed que tenga cuidado).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Tenga en cuenta que, aunque existen planes para llevar la interfaz de usuario de las bibliotecas UDF JavaScript al mismo lugar donde se encuentra la interfaz de usuario de Eventing (por ejemplo, con un depurador), a\u00fan no hemos llegado a ese punto, y es probable que la interfaz de usuario cambie en consecuencia, tanto en aspecto como en ubicaci\u00f3n.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13559\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/image2-1-1024x950.png\" alt=\"Add JavaScript library using UI\" width=\"900\" height=\"835\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image2-1-1024x950.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image2-1-300x278.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image2-1-768x712.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image2-1-1536x1424.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image2-1-20x20.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image2-1-1320x1224.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/image2-1.png 1734w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<h3><span style=\"font-weight: 400;\">N1QL en JavaScript <\/span><\/h3>\n<p><span style=\"font-weight: 400;\">El motor JavaScript suministrado con la versi\u00f3n 7.0.x s\u00f3lo es capaz de ejecutar JavaScript vainilla, y carece de la capacidad de ejecutar peticiones N1QL.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">En 7.1.x el motor JavaScript ahora puede ejecutar m\u00faltiples sentencias N1QL y soporta tanto iteradores como transacciones.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Almacenamiento jer\u00e1rquico de bibliotecas JavaScript<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">En 7.0 el almac\u00e9n de librer\u00edas JavaScript es un repositorio plano, lo que significa que todas las librer\u00edas se encuentran al mismo nivel, y son visibles tanto para las UDFs N1QL globales como para las de \u00e1mbito.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Estas bibliotecas son compartidas.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">En 7.1 se ha ampliado el almacenamiento para que sea jer\u00e1rquico.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Las bibliotecas de nivel ra\u00edz siguen siendo accesibles a las UDFs N1QL tanto globales como de \u00e1mbito y compartidas como antes, y adem\u00e1s ahora es posible tener bibliotecas definidas bajo un bucket y \u00e1mbito espec\u00edficos, ya sea como implementaciones separadas de bibliotecas de nivel ra\u00edz espec\u00edficas para un \u00e1mbito en particular, o como un almacenamiento privado de bibliotecas para usuarios con acceso s\u00f3lo a un \u00e1mbito en particular.<\/span><\/p>\n<p>&nbsp;<\/p>\n<h2><span style=\"font-weight: 400;\">Conclusi\u00f3n<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Este blog te da una muestra de las funciones definidas por el usuario de JavaScript en Couchbase Server 7.1.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Exploraremos cada uno de ellos en detalle en blogs posteriores.<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Por ahora, lea m\u00e1s sobre <a href=\"https:\/\/www.couchbase.com\/blog\/es\/n1ql-user-defined-functions\/\" target=\"_blank\" rel=\"noopener\">UDFs N1QL en Couchbase<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Among the many great features introduced in Couchbase Server 7.0, one has the potential for a greater impact in later releases: N1QL User Defined Functions. A quick glance at the past N1QL is a declarative language, meaning that requests merely [&hellip;]<\/p>","protected":false},"author":1782,"featured_media":11779,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,9327,1812],"tags":[2133,1543,8911],"ppma_author":[8924],"class_list":["post-13556","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-javascript","category-n1ql-query","tag-functions","tag-javascript","tag-udf"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>From N1QL to Javascript and Back - Part 1: Introduction<\/title>\n<meta name=\"description\" content=\"This blog gives you a taster of N1QL and the JavaScript User Defined Functions (UDF) features in Couchbase Server 7.1. Learn more with Couchbase.\" \/>\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\/from-n1ql-to-javascript-and-back-part-1-introduction\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"From N1QL to Javascript and Back - Part 1: Introduction\" \/>\n<meta property=\"og:description\" content=\"This blog gives you a taster of N1QL and the JavaScript User Defined Functions (UDF) features in Couchbase Server 7.1. Learn more with Couchbase.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-1-introduction\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-07-13T17:09:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T00:20:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Marco Greco, Software Architect, 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=\"Marco Greco, Software Architect, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/\"},\"author\":{\"name\":\"Marco Greco, Software Architect, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2b5184a7cdb443ff2897aff0866cd6fd\"},\"headline\":\"From N1QL to Javascript and Back &#8211; Part 1: Introduction\",\"datePublished\":\"2022-07-13T17:09:45+00:00\",\"dateModified\":\"2025-06-14T00:20:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/\"},\"wordCount\":833,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg\",\"keywords\":[\"functions\",\"javascript\",\"User Defined Function (UDF)\"],\"articleSection\":[\"Couchbase Server\",\"JavaScript\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/\",\"name\":\"From N1QL to Javascript and Back - Part 1: Introduction\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg\",\"datePublished\":\"2022-07-13T17:09:45+00:00\",\"dateModified\":\"2025-06-14T00:20:45+00:00\",\"description\":\"This blog gives you a taster of N1QL and the JavaScript User Defined Functions (UDF) features in Couchbase Server 7.1. Learn more with Couchbase.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg\",\"width\":1200,\"height\":628,\"caption\":\"Learn these tips and tricks for creating user-defined functions (UDFs) with the N1QL query language\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"From N1QL to Javascript and Back &#8211; Part 1: Introduction\"}]},{\"@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\/2b5184a7cdb443ff2897aff0866cd6fd\",\"name\":\"Marco Greco, Software Architect, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/707c967b795fd71b6330f6d3118cf308\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e6be0ee56851d2f71a554731d5edd5c820069680f0a810b47f094091c58bc553?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e6be0ee56851d2f71a554731d5edd5c820069680f0a810b47f094091c58bc553?s=96&d=mm&r=g\",\"caption\":\"Marco Greco, Software Architect, Couchbase\"},\"description\":\"In a previous life, Marco used to be CTO, radiation physicist, software architect, sysadmin, DBA, trainer and general handyman at Italy's largest radiation theraphy practice. Having switched career and country, he spent more than two decades in various support and development positions in Informix first and IBM later, before finally taking the plunge and joining Couchbase, to help them make gold out of N1QL. He holds several patents and has authored open source projects of his own.\",\"sameAs\":[\"https:\/\/github.com\/marcogrecopriolo\",\"https:\/\/www.linkedin.com\/in\/marco-greco-7665308\/\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/marcocouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"From N1QL to Javascript and Back - Part 1: Introduction","description":"Este blog te da una muestra de N1QL y las funciones JavaScript definidas por el usuario (UDF) en Couchbase Server 7.1. Aprende m\u00e1s con Couchbase.","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\/from-n1ql-to-javascript-and-back-part-1-introduction\/","og_locale":"es_MX","og_type":"article","og_title":"From N1QL to Javascript and Back - Part 1: Introduction","og_description":"This blog gives you a taster of N1QL and the JavaScript User Defined Functions (UDF) features in Couchbase Server 7.1. Learn more with Couchbase.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-1-introduction\/","og_site_name":"The Couchbase Blog","article_published_time":"2022-07-13T17:09:45+00:00","article_modified_time":"2025-06-14T00:20:45+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg","type":"image\/jpeg"}],"author":"Marco Greco, Software Architect, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Marco Greco, Software Architect, Couchbase","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/"},"author":{"name":"Marco Greco, Software Architect, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2b5184a7cdb443ff2897aff0866cd6fd"},"headline":"From N1QL to Javascript and Back &#8211; Part 1: Introduction","datePublished":"2022-07-13T17:09:45+00:00","dateModified":"2025-06-14T00:20:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/"},"wordCount":833,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg","keywords":["functions","javascript","User Defined Function (UDF)"],"articleSection":["Couchbase Server","JavaScript","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/","url":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/","name":"From N1QL to Javascript and Back - Part 1: Introduction","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg","datePublished":"2022-07-13T17:09:45+00:00","dateModified":"2025-06-14T00:20:45+00:00","description":"Este blog te da una muestra de N1QL y las funciones JavaScript definidas por el usuario (UDF) en Couchbase Server 7.1. Aprende m\u00e1s con Couchbase.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2020\/12\/user-defined-functions-n1ql-query-language-couchbase-7-0.jpg","width":1200,"height":628,"caption":"Learn these tips and tricks for creating user-defined functions (UDFs) with the N1QL query language"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-1-introduction\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"From N1QL to Javascript and Back &#8211; Part 1: Introduction"}]},{"@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\/2b5184a7cdb443ff2897aff0866cd6fd","name":"Marco Greco, Arquitecto de software, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/707c967b795fd71b6330f6d3118cf308","url":"https:\/\/secure.gravatar.com\/avatar\/e6be0ee56851d2f71a554731d5edd5c820069680f0a810b47f094091c58bc553?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e6be0ee56851d2f71a554731d5edd5c820069680f0a810b47f094091c58bc553?s=96&d=mm&r=g","caption":"Marco Greco, Software Architect, Couchbase"},"description":"En su vida anterior, Marco fue director de tecnolog\u00eda, radiof\u00edsico, arquitecto de software, administrador de sistemas, administrador de bases de datos, formador y manitas en general en la mayor cl\u00ednica de radioterapia de Italia. Tras cambiar de carrera y de pa\u00eds, pas\u00f3 m\u00e1s de dos d\u00e9cadas en varios puestos de soporte y desarrollo en Informix primero e IBM despu\u00e9s, antes de dar finalmente el paso y unirse a Couchbase, para ayudarles a convertir N1QL en oro. Es titular de varias patentes y autor de sus propios proyectos de c\u00f3digo abierto.","sameAs":["https:\/\/github.com\/marcogrecopriolo","https:\/\/www.linkedin.com\/in\/marco-greco-7665308\/"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/marcocouchbase-com\/"}]}},"authors":[{"term_id":8924,"user_id":1782,"is_guest":0,"slug":"marcocouchbase-com","display_name":"Marco Greco, Software Architect, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/e6be0ee56851d2f71a554731d5edd5c820069680f0a810b47f094091c58bc553?s=96&d=mm&r=g","author_category":"","last_name":"Greco","first_name":"Marco","job_title":"","user_url":"","description":"En su vida anterior, Marco fue director de tecnolog\u00eda, radiof\u00edsico, arquitecto de software, administrador de sistemas, administrador de bases de datos, formador y manitas en general en la mayor cl\u00ednica de radioterapia de Italia.\r\n\r\nTras cambiar de carrera y de pa\u00eds, pas\u00f3 m\u00e1s de dos d\u00e9cadas en varios puestos de soporte y desarrollo en Informix primero e IBM despu\u00e9s, antes de finalmente dar el paso y unirse a Couchbase, para ayudarles a convertir N1QL en oro.\r\n\r\nEs titular de varias patentes y autor de sus propios proyectos de c\u00f3digo abierto."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/13556","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\/1782"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=13556"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/13556\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/11779"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=13556"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=13556"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=13556"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=13556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}