{"id":13596,"date":"2022-07-26T08:37:35","date_gmt":"2022-07-26T15:37:35","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=13596"},"modified":"2025-06-13T17:20:45","modified_gmt":"2025-06-14T00:20:45","slug":"from-n1ql-to-javascript-and-back-part-2","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-2\/","title":{"rendered":"De N1QL a JavaScript y viceversa - Parte 2: Uso b\u00e1sico"},"content":{"rendered":"<p><a href=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-1-introduction\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">El blog anterior<\/span><\/a><span style=\"font-weight: 400;\"> le ha presentado nuevas caracter\u00edsticas de las funciones definidas por el usuario de JavaScript.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Ahora vamos a explorarlos con m\u00e1s detalle.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Comenzamos con un mecanismo b\u00e1sico para ejecutar sentencias N1QL dentro de c\u00f3digo JavaScript.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">N1QL en JavaScript<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Hay dos formas de ejecutar sentencias N1QL dentro de una funci\u00f3n JavaScript: llamando directamente a una funci\u00f3n llamada N1QL(), o dejando que el compilador JavaScript detecte las sentencias N1QL incrustadas y produzca las correspondientes llamadas a N1QL().<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A continuaci\u00f3n se examina cada m\u00e9todo.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Ejemplo de requisitos previos<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">En las secciones siguientes se presentan algunos ejemplos.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Estos son totalmente funcionales pero para ejecutarlos necesitar\u00e1s:<\/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;\">un cl\u00faster Couchbase, versi\u00f3n 7.1 o posterior<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">un cubo llamado <\/span><i><span style=\"font-weight: 400;\">b1<\/span><\/i><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">un \u00edndice primario en <\/span><i><span style=\"font-weight: 400;\">b1<\/span><\/i><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">para crear cada funci\u00f3n en una biblioteca llamada <\/span><i><span style=\"font-weight: 400;\">udfblog<\/span><\/i><span style=\"font-weight: 400;\">y<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">para crear la correspondiente UDF N1QL<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Puede utilizar la pesta\u00f1a UDF de la consola web para crear la funci\u00f3n y la UDF.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Funci\u00f3n N1QL()<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">En <em>N1QL()<\/em> toma una declaraci\u00f3n en forma de cadena y un segundo par\u00e1metro opcional que contiene valores de marcador de posici\u00f3n.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Todo lo que se necesita para ejecutar una sentencia N1QL que no toma par\u00e1metros y no devuelve valores es lo siguiente:\u00a0<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13598 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/snippet1-1024x101.jpg\" alt=\"\" width=\"900\" height=\"89\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet1-1024x101.jpg 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet1-300x29.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet1-768x75.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet1-1536x151.jpg 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet1-20x2.jpg 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet1-1320x130.jpg 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet1.jpg 2016w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">y la correspondiente UDF:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">CREATE FUNCTION doInsert() LANGUAGE JAVASCRIPT AS \"doInsert\" AT \"udfblog\"<\/pre>\n<p><span style=\"font-weight: 400;\">(Olvida por un segundo que la funci\u00f3n en s\u00ed no devuelve ning\u00fan valor. Tambi\u00e9n, disculpas por los fragmentos de c\u00f3digo que se muestran como im\u00e1genes, WordPress no le gustaba renderizar estos como texto).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Cuando el <em>N1QL()<\/em> la sentencia pasada en el primer par\u00e1metro se analiza, planifica y ejecuta.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Si la sentencia no devuelve ning\u00fan valor, en el momento en que la funci\u00f3n N1QL regresa, la sentencia ha completado su ejecuci\u00f3n: en este caso concreto, suponiendo que el cubo <\/span><i><span style=\"font-weight: 400;\">b1<\/span><\/i><span style=\"font-weight: 400;\"> existe y una clave <\/span><i><span style=\"font-weight: 400;\">k1<\/span><\/i><span style=\"font-weight: 400;\"> no existe ya, se insertar\u00e1 un nuevo documento.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Si est\u00e1 familiarizado con ESQL\/C's o PL\/SQL's <\/span><em><span style=\"font-weight: 400;\">EJECUTAR INMEDIATAMENTE<\/span><\/em><span style=\"font-weight: 400;\"> declaraci\u00f3n, el <em>N1QL()<\/em> es el equivalente de la UDF de JavaScript.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Cuando se devuelven valores, el valor de retorno de <em>N1QL()<\/em> es un iterador de JavaScript, que se puede utilizar para recoger valores de uno en uno, como veremos m\u00e1s adelante.\u00a0<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">N1QL din\u00e1mico<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Por supuesto, el otro uso del <em>N1QL()<\/em> es construir una sentencia din\u00e1micamente concatenando cadenas, por ejemplo:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13599\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/snippet2-1024x186.jpg\" alt=\"\" width=\"900\" height=\"163\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet2-1024x186.jpg 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet2-300x55.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet2-768x140.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet2-1536x279.jpg 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet2-20x4.jpg 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet2-1320x240.jpg 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet2.jpg 2014w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Aunque esto es perfectamente legal, probablemente sea mejor no emplear dicha t\u00e9cnica dado el riesgo de inyecci\u00f3n N1QL (o m\u00e1s generalmente SQL) que conlleva.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Utilice marcadores de posici\u00f3n en su lugar.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Transpilador JavaScript<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">La segunda forma de ejecutar N1QL es incrustar la sentencia N1QL en el cuerpo de la funci\u00f3n, y dejar que el transpilador (un componente del compilador JavaScript) lo detecte y construya las llamadas N1QL correctas entre bastidores:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Esto es muy conveniente para ejecutar sentencias est\u00e1ticas inmediatamente, y la funci\u00f3n de repente se vuelve mucho m\u00e1s legible.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13600\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/07\/snippet3-1024x102.jpg\" alt=\"\" width=\"900\" height=\"90\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet3-1024x102.jpg 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet3-300x30.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet3-768x76.jpg 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet3-1536x153.jpg 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet3-20x2.jpg 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet3-1320x131.jpg 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/07\/snippet3.jpg 2010w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<h2><span style=\"font-weight: 400;\">Marcadores de posici\u00f3n y valores de los marcadores de posici\u00f3n de las sentencias N1QL<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">La mejor manera de evitar los riesgos asociados con la generaci\u00f3n din\u00e1mica de N1QL es tener sentencias est\u00e1ticas usando marcadores de posici\u00f3n con nombre o posicionales, y pasando valores de marcadores de posici\u00f3n en tiempo de ejecuci\u00f3n.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Funci\u00f3n N1QL()<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Al utilizar el <em>N1QL()<\/em> esto puede hacerse pasando los valores en el segundo argumento opcional como se indica a continuaci\u00f3n.<\/span><\/p>\n<h4><span style=\"font-weight: 400;\">Par\u00e1metros de posici\u00f3n<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">Este caso se cubre pasando un array de valores:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">function doInsert() {\r\n    var q = N1QL(\"insert into b1 values(\\\"k4\\\", {\\\"f1\\\": $1})\", [4]);\r\n}<\/pre>\n<h4><span style=\"font-weight: 400;\">Par\u00e1metros con nombre<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">En este caso, basta con pasar un objeto cuyo nombre de campo coincida con los nombres de los par\u00e1metros:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">function doInsert() {\r\n    var q = N1QL(\"insert into b1 values(\\\"k5\\\", {\\\"f1\\\": $p1})\", { p1: 5});\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">No es posible mezclar par\u00e1metros posicionales y con nombre, el <em>N1QL()<\/em> s\u00f3lo acepta un array o un objeto.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Tenga en cuenta que los valores pasados a <em>N1QL()<\/em> no tienen que ser literales, puedes construir arrays y objetos a partir de variables, o puedes pasar una variable array u objeto:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">funci\u00f3n doInsert() {\r\n    let p1 = 6;\r\n    var q = N1QL(\"insert into b1 values(\\\"k6\\\", {\\\"f1\\\": $1})\", [p1]);\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">o<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">funci\u00f3n doInsert() {\r\n    let p1 = [7];\r\n    var q = N1QL(\"insert into b1 values(\\\"k7\\\", {\\\"f1\\\": $1})\", p1);\r\n}<\/pre>\n<h3><span style=\"font-weight: 400;\">Transpiler<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Con el transpilador, s\u00f3lo son posibles los par\u00e1metros con nombre - sin embargo, utilizarlos es tan sencillo como utilizar variables ya declaradas:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">funci\u00f3n doInsert() {\r\n    let p1 = 8;\r\n    var q = insert into b1 values(\"k8\", {\"f1\": $p1});\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Por supuesto, es posible utilizar directamente los par\u00e1metros de las funciones:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">funci\u00f3n doInsert(p1) {\r\n    var q = insert into b1 values(\"k9\", {\"k1\": $p1});\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Y la correspondiente UDF N1QL:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">CREATE FUNCTION doInsert(p1) LANGUAGE JAVASCRIPT AS \"doInsert\" AT \"udfblog\"<\/pre>\n<h2><span style=\"font-weight: 400;\">Conclusi\u00f3n<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Hemos cubierto ejemplos b\u00e1sicos sobre c\u00f3mo utilizar N1QL dentro de funciones javascript, tanto utilizando la funci\u00f3n <em>N1QL()<\/em> e incrustar la sentencia N1QL directamente en JavaScript, y mostrar c\u00f3mo utilizar par\u00e1metros con nombre y posicionales.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">La pr\u00f3xima entrada del blog cubrir\u00e1 las sentencias iteradoras y de manipulaci\u00f3n de datos.<\/span><\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>The previous blog introduced to you new features in JavaScript user-defined functions. We are now going to explore them in more detail. We start with a basic mechanism to execute N1QL statements inside JavaScript code. N1QL in JavaScript There are [&hellip;]<\/p>","protected":false},"author":1782,"featured_media":12241,"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-13596","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 v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>N1QL in JavaScript &amp; N1QL() Function (Part 2: Basic Usage)<\/title>\n<meta name=\"description\" content=\"In the previous blog introduced to you new features in JavaScript user-defined functions. We are now going to explore them in more detail. Learn more.\" \/>\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-2\/\" \/>\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 2: Basic Usage\" \/>\n<meta property=\"og:description\" content=\"In the previous blog introduced to you new features in JavaScript user-defined functions. We are now going to explore them in more detail. Learn more.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-2\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-07-26T15:37:35+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\/2021\/10\/denormalization-guide-data-import-rdbms-tables-couchbase-n1ql-queries.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-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/\"},\"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 2: Basic Usage\",\"datePublished\":\"2022-07-26T15:37:35+00:00\",\"dateModified\":\"2025-06-14T00:20:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/\"},\"wordCount\":714,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/10\/denormalization-guide-data-import-rdbms-tables-couchbase-n1ql-queries.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-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/\",\"name\":\"N1QL in JavaScript & N1QL() Function (Part 2: Basic Usage)\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/10\/denormalization-guide-data-import-rdbms-tables-couchbase-n1ql-queries.jpg\",\"datePublished\":\"2022-07-26T15:37:35+00:00\",\"dateModified\":\"2025-06-14T00:20:45+00:00\",\"description\":\"In the previous blog introduced to you new features in JavaScript user-defined functions. We are now going to explore them in more detail. Learn more.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/10\/denormalization-guide-data-import-rdbms-tables-couchbase-n1ql-queries.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/10\/denormalization-guide-data-import-rdbms-tables-couchbase-n1ql-queries.jpg\",\"width\":1200,\"height\":628,\"caption\":\"Learn how to import and denormalize your data from a relational database into Couchbase using N1QL\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/#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 2: Basic Usage\"}]},{\"@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":"N1QL in JavaScript & N1QL() Function (Part 2: Basic Usage)","description":"En el blog anterior le presentamos las nuevas caracter\u00edsticas de las funciones definidas por el usuario de JavaScript. Ahora vamos a explorarlas con m\u00e1s detalle. M\u00e1s informaci\u00f3n.","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-2\/","og_locale":"es_MX","og_type":"article","og_title":"From N1QL to JavaScript and Back - Part 2: Basic Usage","og_description":"In the previous blog introduced to you new features in JavaScript user-defined functions. We are now going to explore them in more detail. Learn more.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-2\/","og_site_name":"The Couchbase Blog","article_published_time":"2022-07-26T15:37:35+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\/2021\/10\/denormalization-guide-data-import-rdbms-tables-couchbase-n1ql-queries.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-2\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/"},"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 2: Basic Usage","datePublished":"2022-07-26T15:37:35+00:00","dateModified":"2025-06-14T00:20:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/"},"wordCount":714,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/10\/denormalization-guide-data-import-rdbms-tables-couchbase-n1ql-queries.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-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/","url":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/","name":"N1QL in JavaScript & N1QL() Function (Part 2: Basic Usage)","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/10\/denormalization-guide-data-import-rdbms-tables-couchbase-n1ql-queries.jpg","datePublished":"2022-07-26T15:37:35+00:00","dateModified":"2025-06-14T00:20:45+00:00","description":"En el blog anterior le presentamos las nuevas caracter\u00edsticas de las funciones definidas por el usuario de JavaScript. Ahora vamos a explorarlas con m\u00e1s detalle. M\u00e1s informaci\u00f3n.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/10\/denormalization-guide-data-import-rdbms-tables-couchbase-n1ql-queries.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/10\/denormalization-guide-data-import-rdbms-tables-couchbase-n1ql-queries.jpg","width":1200,"height":628,"caption":"Learn how to import and denormalize your data from a relational database into Couchbase using N1QL"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-2\/#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 2: Basic Usage"}]},{"@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\/13596","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=13596"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/13596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/12241"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=13596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=13596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=13596"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=13596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}