{"id":13854,"date":"2022-11-03T13:43:33","date_gmt":"2022-11-03T20:43:33","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=13854"},"modified":"2024-09-12T01:42:30","modified_gmt":"2024-09-12T08:42:30","slug":"from-n1ql-to-javascript-and-back-part-7","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-7\/","title":{"rendered":"De N1QL a JavaScript y viceversa - Parte 7: Almacenamiento jer\u00e1rquico en JavaScript"},"content":{"rendered":"<p><span style=\"font-weight: 400\">En blogs anteriores, cubrimos la ejecuci\u00f3n de N1QL (SQL++) desde JavaScript\u00a0<a href=\"https:\/\/blog.couchbase.com\/from-n1ql-to-javascript-and-back-part-1-introduction\/\" target=\"_blank\" rel=\"noopener\">funciones<\/a>Tramitaci\u00f3n de documentos\u00a0<a href=\"https:\/\/blog.couchbase.com\/from-n1ql-to-javascript-and-back-part-3\/\" target=\"_blank\" rel=\"noopener\">a trav\u00e9s de iteradores<\/a>,\u00a0<a href=\"https:\/\/blog.couchbase.com\/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>, <a href=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-5\/\" target=\"_blank\" rel=\"noopener\">declaraciones preparadas<\/a> y otros <a href=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-6\/\" target=\"_blank\" rel=\"noopener\">temas avanzados<\/a>. El \u00faltimo tema a tratar es una nueva caracter\u00edstica a\u00f1adida a 7.1 que permite opciones de almacenamiento de bibliotecas JavaScript.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Almacenamiento jer\u00e1rquico de bibliotecas JavaScript<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Otro cambio importante en 7.1 es que el almacenamiento de la biblioteca JavaScript ha pasado de ser plano a jer\u00e1rquico.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Esto significa que, junto a las bibliotecas globales, ahora puedes tener bibliotecas creadas bajo un bucket y un scope.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Las bibliotecas globales est\u00e1n disponibles para su uso como UDF globales y de \u00e1mbito, mientras que las bibliotecas de \u00e1mbito s\u00f3lo est\u00e1n disponibles para su uso para UDF de \u00e1mbito creadas bajo el mismo \u00e1mbito que la biblioteca.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Esto significa que mientras que, al utilizar bibliotecas globales, puede seguir tratando las bibliotecas como una extensi\u00f3n de su aplicaci\u00f3n, y al publicar una nueva biblioteca modifica autom\u00e1ticamente todas sus instancias en distintos buckets y \u00e1mbitos, si s\u00f3lo se le ha concedido la licencia <em>gestionar_funciones_de_alcance_externo<\/em> y quieres crear bibliotecas para tu propio uso, puedes hacerlo.<\/span><\/p>\n<p><span style=\"font-weight: 400\">O puede que, como desarrollador de aplicaciones, quieras crear implementaciones espec\u00edficas de ciertas bibliotecas globales, por ejemplo, una instancia local con c\u00f3digo nuevo que est\u00e1s implementando para la pr\u00f3xima versi\u00f3n de tu aplicaci\u00f3n.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Manipulaci\u00f3n de bibliotecas<\/span><\/h2>\n<p><span style=\"font-weight: 400\">En <em>jsevaluator<\/em> El punto final REST utilizado para manipular las bibliotecas mostradas al principio de este blog se ha ampliado para aceptar buckets y scope.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Esto se hace as\u00ed:<\/span><\/p>\n<p><strong>Biblioteca mundial<\/strong><\/p>\n<pre class=\"left-set:true nums:false wrap:true lang:sh decode:true\">curl -v -X POST https:\/\/localhost:8093\/evaluator\/v1\/libraries\/math -u Administrador:contrase\u00f1a -d 'function add(a, b) { let data = a + b; return data; }'<\/pre>\n<p><strong>Biblioteca<\/strong><\/p>\n<pre class=\"left-set:true nums:false wrap:true lang:sh decode:true\">curl -v -X POST 'https:\/\/localhost:8093\/evaluator\/v1\/libraries\/math?bucket=b1&amp;scope=s1' -u Administrador:contrase\u00f1a -d 'function add(a, b) { let data = a + b; return data; }'<\/pre>\n<p><span style=\"font-weight: 400\">Es evidente que el usuario autenticado debe tener los privilegios adecuados para crear bibliotecas en cada nivel: <\/span><em><span style=\"font-weight: 400\">gestionar_funciones_externas<\/span><\/em><span style=\"font-weight: 400\"> para bibliotecas mundiales y <\/span><em><span style=\"font-weight: 400\">gestionar_funciones_de_alcance_externo<\/span><\/em><span style=\"font-weight: 400\"> para las bibliotecas de \u00e1mbito.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Adem\u00e1s, el cubo y el \u00e1mbito referenciados ya deben existir.<\/span><\/p>\n<p><span style=\"font-weight: 400\">A costa de repetirme, el comando curl debe contener toda la biblioteca, no s\u00f3lo cualquier nueva funci\u00f3n que desee definir: recuerde que cualquier cambio que realice se reflejar\u00e1 en todas las UDFs que utilicen la biblioteca, y cualquier funci\u00f3n que pueda soltar por error afectar\u00e1 potencialmente a m\u00faltiples \u00e1mbitos y UDFs, as\u00ed que tenga cuidado.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Para evitar dudas, esto tambi\u00e9n se aplica a la interfaz de usuario.\u00a0<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Referencias a bibliotecas en UDFs<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Todos los ejemplos de <\/span><span style=\"font-weight: 400\">CREAR FUNCI\u00d3N<\/span><span style=\"font-weight: 400\"> vistos hasta ahora utilizan un simple identificador de cadena para la biblioteca, lo que significa que utilizan una biblioteca global.<\/span><\/p>\n<p><em><span style=\"font-weight: 400\">CREAR FUNCI\u00d3N ... LENGUAJE JAVASCRIPT<\/span><\/em><span style=\"font-weight: 400\"> admite los tres formatos siguientes para los nombres de las bibliotecas:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Un identificador, por ejemplo <\/span><span style=\"font-weight: 400\">&#8220;<em>biblioteca<\/em>&#8220;<\/span><span style=\"font-weight: 400\">esto apunta a una biblioteca global<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">En <\/span><em><span style=\"font-weight: 400\">.\/<\/span><\/em><span style=\"font-weight: 400\"> notaci\u00f3n, por ejemplo, <\/span><span style=\"font-weight: 400\">&#8220;<em>.\/biblioteca<\/em>&#8220;<\/span><span style=\"font-weight: 400\">: esto significa que una biblioteca bajo la actual <em>contexto_de_consulta<\/em>una biblioteca global para una funci\u00f3n global y la biblioteca de \u00e1mbito correspondiente para una funci\u00f3n de \u00e1mbito<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Una ruta de alcance total, por ejemplo <\/span><span style=\"font-weight: 400\">&#8220;<em>bucket\/scope\/biblioteca<\/em>&#8220;<\/span><span style=\"font-weight: 400\">Funciones de \u00e1mbito: las funciones de \u00e1mbito pueden apuntar a bibliotecas de \u00e1mbito, pero tenga en cuenta que la polinizaci\u00f3n entre \u00e1mbitos no est\u00e1 permitida - las funciones de \u00e1mbito s\u00f3lo pueden apuntar a bibliotecas de su propio \u00e1mbito.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">Cualquier otro formato de nombre de biblioteca no est\u00e1 permitido.<\/span><\/p>\n<h2>Consejos y trucos para rizos<\/h2>\n<h3><span style=\"font-weight: 400\">Modificaci\u00f3n de bibliotecas<\/span><\/h3>\n<p><span style=\"font-weight: 400\">Cuando modifique bibliotecas utilizando la API REST, por ejemplo para a\u00f1adir una nueva funci\u00f3n, tenga en cuenta que tiene que enviar de nuevo toda la biblioteca: si s\u00f3lo pasa el texto de la nueva funci\u00f3n, \u00a1todas las funciones anteriores quedar\u00e1n borradas!<\/span><\/p>\n<h3><span style=\"font-weight: 400\">Opciones y conmutadores de l\u00ednea de comandos \u00fatiles<\/span><\/h3>\n<p><span style=\"font-weight: 400\">El rizo <\/span><em><span style=\"font-weight: 400\">-datos-binario<\/span><\/em><span style=\"font-weight: 400\"> indica a curl que no descarte las nuevas l\u00edneas ni los retornos de carro.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Esto es \u00fatil ya que, si su funci\u00f3n devuelve un error, el mensaje de error contendr\u00e1 la informaci\u00f3n de l\u00ednea correcta para el error, frente al uso de <\/span><em><span style=\"font-weight: 400\">-d<\/span><\/em><span style=\"font-weight: 400\"> o <\/span><em><span style=\"font-weight: 400\">-datos<\/span><\/em><span style=\"font-weight: 400\"> har\u00e1 que los errores se notifiquen siempre en la l\u00ednea 1.<\/span><\/p>\n<p><span style=\"font-weight: 400\">A modo de ejemplo:<\/span><\/p>\n<pre class=\"left-set:true nums:false nums-toggle:false wrap:true lang:sh decode:true\">curl -v -X POST https:\/\/localhost:8093\/evaluator\/v1\/libraries\/math -u Administrador:contrase\u00f1a -data-binario 'function add(a, b) {\r\n    let datos = a + b;\r\n    return datos;\r\n}'<\/pre>\n<p><span style=\"font-weight: 400\">Otra funci\u00f3n \u00fatil es guardar el contenido de una biblioteca en un archivo y, a continuaci\u00f3n, hacer referencia al archivo en la funci\u00f3n <\/span><em><span style=\"font-weight: 400\">-datos-binario<\/span><\/em><span style=\"font-weight: 400\"> (o <\/span><em><span style=\"font-weight: 400\">-d<\/span><\/em><span style=\"font-weight: 400\">), anteponiendo el prefijo \"<em>@<\/em>\", por ejemplo:<\/span><\/p>\n<pre class=\"left-set:true nums:false nums-toggle:false wrap:true lang:sh decode:true\">curl -v -X POST https:\/\/localhost:8093\/evaluator\/v1\/libraries\/math -u Administrador:contrase\u00f1a -data-binary '@ruta\/a\/archivo'<\/pre>\n<p><span style=\"font-weight: 400\">Donde su biblioteca se guardar\u00eda en path\/to\/file.<\/span><\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p><span style=\"font-weight: 400\">Este breve post muestra c\u00f3mo estas nuevas opciones de almacenamiento te dan flexibilidad en la forma de gestionar jer\u00e1rquicamente el c\u00f3digo que construyes y despliegas. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Una actualizaci\u00f3n final para usted, mientras que hay referencias basadas en c\u00f3digo para el t\u00e9rmino <em>N1QL<\/em> en esta serie, nos referiremos al lenguaje de consulta como <em>SQL<\/em> - una extensi\u00f3n del est\u00e1ndar SQL. Las consultas en Couchbase est\u00e1n generalmente basadas en SQL++, permiti\u00e9ndote construir sobre tu conocimiento est\u00e1ndar de consultas SQL pero aplic\u00e1ndolo a documentos JSON y m\u00e1s. En el futuro, es probable que puedas cambiar el t\u00e9rmino <em>N1QL<\/em> para <em>SQL<\/em> y estar\u00e1s al d\u00eda.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Gracias por seguir a lo largo de esta serie de temas N1QL y JavaScript, una lista resumida de los temas se incluye a continuaci\u00f3n para su referencia. <\/span><\/p>\n<h3>Recursos<\/h3>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/sqlplusplus\/\" target=\"_blank\" rel=\"noopener\">SQL++ - El lenguaje de consulta de nueva generaci\u00f3n para la gesti\u00f3n de datos JSON<\/a><\/li>\n<li>De SQL++\/N1QL a JavaScript y viceversa:\n<ol>\n<li>SQL\u00a0 <a href=\"https:\/\/blog.couchbase.com\/from-n1ql-to-javascript-and-back-part-1-introduction\/\" target=\"_blank\" rel=\"noopener\">funciones<\/a><\/li>\n<li>Tramitaci\u00f3n de documentos <a href=\"https:\/\/blog.couchbase.com\/from-n1ql-to-javascript-and-back-part-3\/\" target=\"_blank\" rel=\"noopener\">a trav\u00e9s de iteradores<\/a><\/li>\n<li><a href=\"https:\/\/blog.couchbase.com\/from-n1ql-to-javascript-and-back-part-2\/\" target=\"_blank\" rel=\"noopener\">Manipulaci\u00f3n de datos<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-4\/\" target=\"_blank\" rel=\"noopener\">Tratamiento de errores<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-5\/\" target=\"_blank\" rel=\"noopener\">Declaraciones preparadas<\/a><\/li>\n<li>y otros <a href=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-6\/\" target=\"_blank\" rel=\"noopener\">temas avanzados<\/a><\/li>\n<li>Esta entrada, <a href=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-7\/\" target=\"_blank\" rel=\"noopener\">almacenamiento jer\u00e1rquico de bibliotecas JavaScript<\/a><\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>En blogs anteriores, cubrimos la ejecuci\u00f3n de N1QL (SQL++) desde funciones JavaScript, el procesamiento de documentos a trav\u00e9s de iteradores, la manipulaci\u00f3n de datos, el manejo de errores, las sentencias preparadas y otros temas avanzados. El \u00faltimo tema a cubrir es una caracter\u00edstica recientemente a\u00f1adida a 7.1 que permite opciones de almacenamiento de bibliotecas JavaScript. [...]<\/p>","protected":false},"author":1782,"featured_media":13855,"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":[1543,8911],"ppma_author":[8924],"class_list":["post-13854","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-javascript","category-n1ql-query","tag-javascript","tag-udf"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.3 (Yoast SEO v26.3) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>From N1QL to JavaScript and Back - Part 7: Hierarchical JavaScript Storage - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-7\/\" \/>\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 7: Hierarchical JavaScript Storage\" \/>\n<meta property=\"og:description\" content=\"In previous blogs, we covered executing N1QL (SQL++) from JavaScript\u00a0functions, processing documents\u00a0through iterators,\u00a0manipulating data, handling errors, prepared statements and other advanced topics. The final topic to cover is a newly added feature to 7.1 that enables JavaScript library storage options. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-7\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-03T20:43:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-12T08:42:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/image_2022-11-03_115612115-e1667516621439-1024x683.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"683\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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-7\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/\"},\"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 7: Hierarchical JavaScript Storage\",\"datePublished\":\"2022-11-03T20:43:33+00:00\",\"dateModified\":\"2024-09-12T08:42:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/\"},\"wordCount\":811,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/image_2022-11-03_115612115-e1667516621439.png\",\"keywords\":[\"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-7\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/\",\"name\":\"From N1QL to JavaScript and Back - Part 7: Hierarchical JavaScript Storage - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/image_2022-11-03_115612115-e1667516621439.png\",\"datePublished\":\"2022-11-03T20:43:33+00:00\",\"dateModified\":\"2024-09-12T08:42:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/image_2022-11-03_115612115-e1667516621439.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/image_2022-11-03_115612115-e1667516621439.png\",\"width\":1500,\"height\":1000,\"caption\":\"SQL++ N1QL JavaScript library hierarchical\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/#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 7: Hierarchical JavaScript Storage\"}]},{\"@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":"De N1QL a JavaScript y viceversa - Parte 7: Almacenamiento jer\u00e1rquico en JavaScript - El blog de 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-7\/","og_locale":"es_MX","og_type":"article","og_title":"From N1QL to JavaScript and Back - Part 7: Hierarchical JavaScript Storage","og_description":"In previous blogs, we covered executing N1QL (SQL++) from JavaScript\u00a0functions, processing documents\u00a0through iterators,\u00a0manipulating data, handling errors, prepared statements and other advanced topics. The final topic to cover is a newly added feature to 7.1 that enables JavaScript library storage options. [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/from-n1ql-to-javascript-and-back-part-7\/","og_site_name":"The Couchbase Blog","article_published_time":"2022-11-03T20:43:33+00:00","article_modified_time":"2024-09-12T08:42:30+00:00","og_image":[{"width":1024,"height":683,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/image_2022-11-03_115612115-e1667516621439-1024x683.png","type":"image\/png"}],"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-7\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/"},"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 7: Hierarchical JavaScript Storage","datePublished":"2022-11-03T20:43:33+00:00","dateModified":"2024-09-12T08:42:30+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/"},"wordCount":811,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/image_2022-11-03_115612115-e1667516621439.png","keywords":["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-7\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/","url":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/","name":"De N1QL a JavaScript y viceversa - Parte 7: Almacenamiento jer\u00e1rquico en JavaScript - El blog de Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/image_2022-11-03_115612115-e1667516621439.png","datePublished":"2022-11-03T20:43:33+00:00","dateModified":"2024-09-12T08:42:30+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/image_2022-11-03_115612115-e1667516621439.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/image_2022-11-03_115612115-e1667516621439.png","width":1500,"height":1000,"caption":"SQL++ N1QL JavaScript library hierarchical"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/#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 7: Hierarchical JavaScript Storage"}]},{"@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\/13854","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=13854"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/13854\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13855"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=13854"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=13854"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=13854"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=13854"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}