{"id":13785,"date":"2022-10-04T12:19:57","date_gmt":"2022-10-04T19:19:57","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=13785"},"modified":"2025-06-13T17:20:43","modified_gmt":"2025-06-14T00:20:43","slug":"from-n1ql-to-javascript-and-back-part-6","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-6\/","title":{"rendered":"De N1QL a JavaScript y viceversa - Parte 6: Temas avanzados"},"content":{"rendered":"<p><span style=\"font-weight: 400\">En blogs anteriores, cubrimos la ejecuci\u00f3n de N1QL (SQL++) desde JavaScript\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-1-introduction\/\" target=\"_blank\" rel=\"noopener\">funciones<\/a>Tramitaci\u00f3n de documentos\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-3\/\" target=\"_blank\" rel=\"noopener\">a trav\u00e9s de iteradores<\/a>,\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-2\/\" target=\"_blank\" rel=\"noopener\">manipular datos,<\/a> <a href=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-4\/\" target=\"_blank\" rel=\"noopener\">gesti\u00f3n de errores<\/a>y utilizando <a href=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-5\/\" target=\"_blank\" rel=\"noopener\">declaraciones preparadas<\/a>. Tenemos que cubrir algunos temas m\u00e1s avanzados antes de pasar a la manipulaci\u00f3n de bibliotecas JavaScript, como la llamada a otras funciones, el uso de transacciones y RBAC.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Funciones de llamada<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Las funciones JavaScript pueden llamar directamente a otras funciones JavaScript.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Cualquier sentencia N1QL ejecutada en la funci\u00f3n llamada ser\u00e1 ejecutada de la misma manera, y con exactamente las mismas limitaciones, como si fuera ejecutada en la funci\u00f3n llamada. Los resultados pueden viajar libremente arriba y abajo de la pila y cualquier excepci\u00f3n lanzada en la funci\u00f3n llamada har\u00e1 su camino hacia abajo de la pila a la petici\u00f3n N1QL de llamada (a menos que sea capturada y manejada en alg\u00fan lugar).<\/span><\/p>\n<p><span style=\"font-weight: 400\">Esta es definitivamente una forma m\u00e1s pr\u00e1ctica de llamar a funciones que ejecutar sentencias N1QL que llaman a UDFs N1QL. Al llamar a las funciones directamente en lugar de pasar por<\/span><span style=\"font-weight: 400\"> <em>EJECUTAR FUNCI\u00d3N<\/em> <\/span><span style=\"font-weight: 400\">se evita completamente la capa N1QL y se ahorran todos los recursos necesarios para cambiar de JavaScript a N1QL y de nuevo a JavaScript. Esto reduce el coste de los cambios de contexto, tener que mover todos los datos a trav\u00e9s de iteradores y no directamente, y tener que dejar iteradores abiertos durante la duraci\u00f3n de la llamada.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Ejecuci\u00f3n de N1QL que llama a funciones<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Hay veces en las que usted ejecutar\u00e1 sentencias N1QL que llaman a UDFs N1QL y estas UDFs pueden muy bien ser funciones JavaScript en s\u00ed mismas.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Esto es absolutamente de esperar, y funciona exactamente de la misma manera que todo lo que hemos descrito hasta ahora.<\/span><\/p>\n<p><span style=\"font-weight: 400\">La \u00fanica limitaci\u00f3n que debe tener en cuenta es que mientras cualquier sentencia N1QL que JavaScript pueda ejecutar se ejecutar\u00e1 en el mismo servidor que est\u00e1 ejecutando la petici\u00f3n principal. Cada llamada a una funci\u00f3n JavaScript utilizar\u00e1 un nuevo trabajador JavaScript, lo que significa que cuantas m\u00e1s llamadas UDF N1QL anidadas realice, menos trabajadores estar\u00e1n disponibles, y la funci\u00f3n acabar\u00e1 fallando de esta forma:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">funci\u00f3n doRecursion() {\r\n    var q = ejecutar function doRecursion();\r\n}<\/pre>\n<pre class=\"nums:false lang:default decode:true\">CREATE FUNCTION doRecursion() LANGUAGE JAVASCRIPT AS \"doRecursion\" AT \"udfblog\"<\/pre>\n<p><span style=\"font-weight: 400\">Que rinde:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">[\r\n  {\r\n    \"c\u00f3digo\": 10109,\r\n    \"msg\": \"Error al ejecutar la funci\u00f3n 'doRecursion' (udfblog:doRecursion)\",\r\n    \"reason\": {\r\n      \"details\": {\r\n        \"c\u00f3digo\": \"var q = N1QL('ejecutar funci\u00f3n doRecursion();', {}, true);\",\r\n        \"Excepci\u00f3n\": {\r\n          \"caller\": \"javascript:133\",\r\n          \"code\": 10112,\r\n          \"key\": \"function.nested.error\",\r\n          \"message\": \"Error al ejecutar la funci\u00f3n 'doRecursion': 25 llamadas javascript anidadas\"\r\n        },\r\n        \"Location\": \"functions\/udfblog.js:11\",\r\n        \"Stack\": \"at doRecursion (functions\/udfblog.js:11:13)\"\r\n      },\r\n      \"type\": \"Exceptions from JS code\"\r\n    }\r\n  }\r\n]<\/pre>\n<p><span style=\"font-weight: 400\">El l\u00edmite de anidamiento no es fijo, y depende del n\u00famero de trabajadores JavaScript disponibles en el momento en que se ejecuta cada llamada anidada; en t\u00e9rminos generales, cuanto mayor sea la actividad JavaScript presente en el nodo, menor ser\u00e1 este l\u00edmite.<\/span><\/p>\n<p><span style=\"font-weight: 400\">En el ejemplo anterior, el nodo ten\u00eda 48 trabajadores y fall\u00f3 en la 25\u00aa llamada.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">RBAC<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Para ejecutar N1QL como parte de funciones JavaScript, el usuario que ejecuta la funci\u00f3n necesita tener los privilegios apropiados para realizar las acciones (<em>insertar<\/em>, <em>seleccione<\/em>...) especificados en la funci\u00f3n sobre los objetos referenciados por la funci\u00f3n.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Dado que la identidad del usuario que ejecuta la funci\u00f3n no se conoce hasta el momento de la ejecuci\u00f3n, cualquier error de privilegio s\u00f3lo se producir\u00e1 cuando se ejecute la funci\u00f3n, suponiendo que el usuario que ejecuta la funci\u00f3n tenga privilegios para ejecutar funciones JavaScript.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Esto coincide con lo que hacen otros motores de bases de datos.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Efectos secundarios<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Las funciones que se ejecutan como parte de expresiones, no pueden tener efectos secundarios: lo que significa que no se permite ejecutar ning\u00fan DML como parte de esa funci\u00f3n. Esto est\u00e1 en l\u00ednea con lo que hacen otros motores de bases de datos y tiene sentido. No querr\u00edas una funci\u00f3n <em>SELECCIONE<\/em> para insertar datos a sus espaldas mediante el uso de una funci\u00f3n JavaScript.<\/span><\/p>\n<p><span style=\"font-weight: 400\">La \u00fanica forma de que las funciones manipulen el almacenamiento es ejecutarlas de forma aislada a trav\u00e9s de la funci\u00f3n <em>EJECUTAR FUNCI\u00d3N<\/em> declaraci\u00f3n.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Transacciones<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Es perfectamente legal ejecutar sentencias N1QL transaccionales dentro de una funci\u00f3n JavaScript, siempre que la funci\u00f3n se ejecute con la capacidad de tener efectos secundarios, es decir, a trav\u00e9s de la funci\u00f3n <\/span><em><span style=\"font-weight: 400\">EJECUTAR FUNCI\u00d3N<\/span><\/em><span style=\"font-weight: 400\"> declaraci\u00f3n. <\/span><span style=\"font-weight: 400\">La funci\u00f3n puede ejecutar DML en una transacci\u00f3n que se hab\u00eda iniciado antes de ejecutar la funci\u00f3n, puede iniciar la transacci\u00f3n, puede consignar o revertir la transacci\u00f3n, o cualquier combinaci\u00f3n legal de las mismas.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Lo \u00fanico que hay que tener en cuenta es que las sentencias N1QL y los iteradores s\u00f3lo viven completamente dentro o fuera de una transacci\u00f3n, pero no a medias. <\/span><span style=\"font-weight: 400\">Esto significa que si se hab\u00eda iniciado una sentencia select antes de una transacci\u00f3n, pero no se hab\u00edan consumido todos los valores, en cuanto se inicie la transacci\u00f3n, ese iterador se cerrar\u00e1. <\/span><span style=\"font-weight: 400\">Lo mismo ocurre con las sentencias DML que devuelven resultados (se completan antes de que la transacci\u00f3n pueda iniciarse), y se aplica un comportamiento similar cuando una transacci\u00f3n se consigna o se revierte.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Hay buenas razones para ello, y el comportamiento es generalmente coherente con lo que ocurre con los motores de bases de datos. <\/span><span style=\"font-weight: 400\">El motivo es que si permiti\u00e9ramos que las sentencias sobrevivieran a los l\u00edmites de la transacci\u00f3n, las sentencias select no podr\u00edan acceder a los cambios de la transacci\u00f3n y las sentencias DML no podr\u00edan revertirse en su totalidad.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Para evitar dudas, no se puede iniciar una transacci\u00f3n dentro de un bucle que procesa un <em>SELECCIONE<\/em> ya que el iterador se cerrar\u00e1 en cuanto se inicie la transacci\u00f3n.\u00a0<\/span><span style=\"font-weight: 400\">Todo el exterior <em>SELECCIONE<\/em> debe estar dentro de la transacci\u00f3n.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Conclusi\u00f3n<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Con este blog hemos cubierto los principales temas relacionados con la ejecuci\u00f3n de N1QL dentro de funciones JavaScript.\u00a0<\/span><span style=\"font-weight: 400\">El pr\u00f3ximo blog se centrar\u00e1 en las nuevas funciones de gesti\u00f3n de bibliotecas JavaScript.<\/span><\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>In previous blogs, we covered executing N1QL (SQL++) from JavaScript\u00a0functions, processing documents\u00a0through iterators,\u00a0manipulating data, handling errors, and using prepared statements. We have a few more advanced topics to cover before we move onto manipulating JavaScript libraries, such as calling other [&hellip;]<\/p>","protected":false},"author":1782,"featured_media":13080,"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":[9499,2133,1543,1903,8911],"ppma_author":[8924],"class_list":["post-13785","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-javascript","category-n1ql-query","tag-acid-transactions","tag-functions","tag-javascript","tag-rbac","tag-udf"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>From N1QL to JavaScript and Back - Part 6: Advanced Topics<\/title>\n<meta name=\"description\" content=\"Continuing our series, we turn to a few advanced usage concepts covering JavaScript functions calling functions, RBAC, transactions and 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-6\/\" \/>\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 6: Advanced Topics\" \/>\n<meta property=\"og:description\" content=\"Continuing our series, we turn to a few advanced usage concepts covering JavaScript functions calling functions, RBAC, transactions and more.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-6\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-10-04T19:19:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T00:20:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/couchbase-architecture-autonmous-operator-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1805\" \/>\n\t<meta property=\"og:image:height\" content=\"2560\" \/>\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=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/\"},\"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 6: Advanced Topics\",\"datePublished\":\"2022-10-04T19:19:57+00:00\",\"dateModified\":\"2025-06-14T00:20:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/\"},\"wordCount\":860,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/couchbase-architecture-autonmous-operator-scaled.jpg\",\"keywords\":[\"ACID transactions\",\"functions\",\"javascript\",\"RBAC\",\"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-6\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/\",\"name\":\"From N1QL to JavaScript and Back - Part 6: Advanced Topics\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/couchbase-architecture-autonmous-operator-scaled.jpg\",\"datePublished\":\"2022-10-04T19:19:57+00:00\",\"dateModified\":\"2025-06-14T00:20:43+00:00\",\"description\":\"Continuing our series, we turn to a few advanced usage concepts covering JavaScript functions calling functions, RBAC, transactions and more.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/couchbase-architecture-autonmous-operator-scaled.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/couchbase-architecture-autonmous-operator-scaled.jpg\",\"width\":1805,\"height\":2560,\"caption\":\"Couchbase Autonomous Operator architecture grows\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#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 6: Advanced Topics\"}]},{\"@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 6: Advanced Topics","description":"Continuando con nuestra serie, pasamos a algunos conceptos avanzados de uso que cubren funciones de JavaScript llamando a funciones, RBAC, transacciones y m\u00e1s.","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-6\/","og_locale":"es_MX","og_type":"article","og_title":"From N1QL to JavaScript and Back - Part 6: Advanced Topics","og_description":"Continuing our series, we turn to a few advanced usage concepts covering JavaScript functions calling functions, RBAC, transactions and more.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-6\/","og_site_name":"The Couchbase Blog","article_published_time":"2022-10-04T19:19:57+00:00","article_modified_time":"2025-06-14T00:20:43+00:00","og_image":[{"width":1805,"height":2560,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/couchbase-architecture-autonmous-operator-scaled.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":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/"},"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 6: Advanced Topics","datePublished":"2022-10-04T19:19:57+00:00","dateModified":"2025-06-14T00:20:43+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/"},"wordCount":860,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/couchbase-architecture-autonmous-operator-scaled.jpg","keywords":["ACID transactions","functions","javascript","RBAC","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-6\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/","url":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/","name":"From N1QL to JavaScript and Back - Part 6: Advanced Topics","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/couchbase-architecture-autonmous-operator-scaled.jpg","datePublished":"2022-10-04T19:19:57+00:00","dateModified":"2025-06-14T00:20:43+00:00","description":"Continuando con nuestra serie, pasamos a algunos conceptos avanzados de uso que cubren funciones de JavaScript llamando a funciones, RBAC, transacciones y m\u00e1s.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/couchbase-architecture-autonmous-operator-scaled.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/04\/couchbase-architecture-autonmous-operator-scaled.jpg","width":1805,"height":2560,"caption":"Couchbase Autonomous Operator architecture grows"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#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 6: Advanced Topics"}]},{"@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\/13785","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=13785"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/13785\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13080"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=13785"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=13785"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=13785"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=13785"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}