{"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\/pt\/from-n1ql-to-javascript-and-back-part-7\/","title":{"rendered":"De N1QL para JavaScript e vice-versa - Parte 7: Armazenamento hier\u00e1rquico em JavaScript"},"content":{"rendered":"<p><span style=\"font-weight: 400\">Em blogs anteriores, abordamos a execu\u00e7\u00e3o do N1QL (SQL++) a partir do JavaScript\u00a0<a href=\"https:\/\/blog.couchbase.com\/from-n1ql-to-javascript-and-back-part-1-introduction\/\" target=\"_blank\" rel=\"noopener\">fun\u00e7\u00f5es<\/a>, processamento de documentos\u00a0<a href=\"https:\/\/blog.couchbase.com\/from-n1ql-to-javascript-and-back-part-3\/\" target=\"_blank\" rel=\"noopener\">por meio de iteradores<\/a>,\u00a0<a href=\"https:\/\/blog.couchbase.com\/from-n1ql-to-javascript-and-back-part-2\/\" target=\"_blank\" rel=\"noopener\">manipula\u00e7\u00e3o de dados,<\/a> <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/from-n1ql-to-javascript-and-back-part-4\/\" target=\"_blank\" rel=\"noopener\">tratamento de erros<\/a>, <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/from-n1ql-to-javascript-and-back-part-5\/\" target=\"_blank\" rel=\"noopener\">declara\u00e7\u00f5es preparadas<\/a> e outros <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/from-n1ql-to-javascript-and-back-part-6\/\" target=\"_blank\" rel=\"noopener\">t\u00f3picos avan\u00e7ados<\/a>. O \u00faltimo t\u00f3pico a ser abordado \u00e9 um recurso rec\u00e9m-adicionado \u00e0 vers\u00e3o 7.1 que permite op\u00e7\u00f5es de armazenamento de bibliotecas JavaScript.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Armazenamento hier\u00e1rquico de bibliotecas JavaScript<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Outra grande mudan\u00e7a na vers\u00e3o 7.1 \u00e9 o fato de o armazenamento da biblioteca JavaScript ter mudado de plano para hier\u00e1rquico.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Isso significa que, al\u00e9m das bibliotecas globais, agora voc\u00ea pode ter bibliotecas criadas em um bucket e um escopo.<\/span><\/p>\n<p><span style=\"font-weight: 400\">As bibliotecas globais est\u00e3o dispon\u00edveis para uso como UDFs globais e de escopo, enquanto as bibliotecas de escopo s\u00f3 est\u00e3o dispon\u00edveis para uso em UDFs de escopo criados no mesmo escopo da biblioteca.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Isso significa que, ao usar bibliotecas globais, voc\u00ea pode continuar a tratar as bibliotecas como uma extens\u00e3o do seu aplicativo e, ao publicar uma nova biblioteca, voc\u00ea altera automaticamente todas as suas inst\u00e2ncias em diferentes compartimentos e escopos, se voc\u00ea s\u00f3 tiver recebido o <em>manage_external_scope_functions<\/em> e quiser criar bibliotecas para seu pr\u00f3prio uso, voc\u00ea pode.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Ou talvez, como desenvolvedor de aplicativos, voc\u00ea queira criar implementa\u00e7\u00f5es espec\u00edficas de escopo de determinadas bibliotecas globais, por exemplo, uma inst\u00e2ncia local com o novo c\u00f3digo que voc\u00ea est\u00e1 implementando para a pr\u00f3xima vers\u00e3o do seu aplicativo.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Manipula\u00e7\u00e3o de bibliotecas<\/span><\/h2>\n<p><span style=\"font-weight: 400\">O <em>jsevaluator<\/em> O endpoint REST usado para manipular as bibliotecas mostradas no in\u00edcio deste blog foi ampliado para aceitar buckets e escopo.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Isso \u00e9 feito da seguinte forma:<\/span><\/p>\n<p><strong>Biblioteca global<\/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 Administrator:password -d 'function add(a, b) { let data = a + b; return data; }'<\/pre>\n<p><strong>Biblioteca de escopo<\/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 Administrator:password -d 'function add(a, b) { let data = a + b; return data; }'<\/pre>\n<p><span style=\"font-weight: 400\">\u00c9 evidente que o usu\u00e1rio autenticado precisa ter os privil\u00e9gios adequados para criar bibliotecas em cada n\u00edvel: <\/span><em><span style=\"font-weight: 400\">manage_external_functions<\/span><\/em><span style=\"font-weight: 400\"> para bibliotecas globais e <\/span><em><span style=\"font-weight: 400\">manage_external_scope_functions<\/span><\/em><span style=\"font-weight: 400\"> para bibliotecas de escopo.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Al\u00e9m disso, o bucket e o escopo referenciados j\u00e1 devem existir.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Para n\u00e3o me repetir, o comando curl deve conter toda a biblioteca, e n\u00e3o apenas qualquer nova fun\u00e7\u00e3o que voc\u00ea queira definir: lembre-se de que qualquer altera\u00e7\u00e3o que voc\u00ea fizer ser\u00e1 refletida em todos os UDFs que usam a biblioteca, e qualquer fun\u00e7\u00e3o que voc\u00ea descartar por engano poder\u00e1 afetar v\u00e1rios escopos e UDFs, portanto, tenha cuidado.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Para evitar d\u00favidas, isso tamb\u00e9m se aplica \u00e0 interface do usu\u00e1rio.\u00a0<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Refer\u00eancia a bibliotecas em UDFs<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Todos os exemplos de <\/span><span style=\"font-weight: 400\">CRIAR FUN\u00c7\u00c3O<\/span><span style=\"font-weight: 400\"> vistos at\u00e9 agora usam um identificador de string simples para a biblioteca, o que significa que eles usam uma biblioteca global.<\/span><\/p>\n<p><em><span style=\"font-weight: 400\">CRIAR FUN\u00c7\u00c3O ... LINGUAGEM JAVASCRIPT<\/span><\/em><span style=\"font-weight: 400\"> suporta os tr\u00eas formatos a seguir para nomes de 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\">Um identificador, por exemplo, <\/span><span style=\"font-weight: 400\">&#8220;<em>biblioteca<\/em>&#8220;<\/span><span style=\"font-weight: 400\">: isso aponta para uma biblioteca global<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">O <\/span><em><span style=\"font-weight: 400\">.\/<\/span><\/em><span style=\"font-weight: 400\"> nota\u00e7\u00e3o, por exemplo, <\/span><span style=\"font-weight: 400\">&#8220;<em>.\/biblioteca<\/em>&#8220;<\/span><span style=\"font-weight: 400\">: isso significa que uma biblioteca sob o atual <em>contexto_de_consulta<\/em>, uma biblioteca global para uma fun\u00e7\u00e3o global e a biblioteca de escopo correspondente para uma fun\u00e7\u00e3o de escopo<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Um caminho de escopo completo, por exemplo, <\/span><span style=\"font-weight: 400\">&#8220;<em>bucket\/scope\/biblioteca<\/em>&#8220;<\/span><span style=\"font-weight: 400\">Fun\u00e7\u00f5es de escopo podem apontar para bibliotecas de escopo, mas lembre-se de que a poliniza\u00e7\u00e3o entre escopos n\u00e3o \u00e9 permitida - as fun\u00e7\u00f5es de escopo s\u00f3 podem apontar para bibliotecas em seu pr\u00f3prio escopo.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">Qualquer outro formato de nome de biblioteca n\u00e3o \u00e9 permitido.<\/span><\/p>\n<h2>Dicas e truques para cachos<\/h2>\n<h3><span style=\"font-weight: 400\">Altera\u00e7\u00e3o de bibliotecas<\/span><\/h3>\n<p><span style=\"font-weight: 400\">Ao alterar as bibliotecas usando a API REST, por exemplo, para adicionar uma nova fun\u00e7\u00e3o, lembre-se de que \u00e9 necess\u00e1rio enviar toda a biblioteca novamente: se voc\u00ea passar apenas o texto da nova fun\u00e7\u00e3o, todas as fun\u00e7\u00f5es anteriores ser\u00e3o apagadas!<\/span><\/p>\n<h3><span style=\"font-weight: 400\">Op\u00e7\u00f5es e switches de linha de comando \u00fateis<\/span><\/h3>\n<p><span style=\"font-weight: 400\">A ondula\u00e7\u00e3o <\/span><em><span style=\"font-weight: 400\">-data-binary<\/span><\/em><span style=\"font-weight: 400\"> A op\u00e7\u00e3o de linha de comando instrui o curl a n\u00e3o descartar novas linhas e retornos de carro.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Isso \u00e9 \u00fatil porque, se sua fun\u00e7\u00e3o retornar um erro, a mensagem de erro conter\u00e1 as informa\u00e7\u00f5es de linha corretas para o erro, em vez de usar <\/span><em><span style=\"font-weight: 400\">-d<\/span><\/em><span style=\"font-weight: 400\"> ou <\/span><em><span style=\"font-weight: 400\">-dados<\/span><\/em><span style=\"font-weight: 400\"> far\u00e1 com que os erros sejam sempre relatados como tendo ocorrido na linha 1!<\/span><\/p>\n<p><span style=\"font-weight: 400\">Por exemplo:<\/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 Administrator:password \u2014data-binary 'function add(a, b) {\r\n    let data = a + b;\r\n    return data;\r\n}'<\/pre>\n<p><span style=\"font-weight: 400\">Outro recurso \u00fatil \u00e9 salvar o conte\u00fado de uma biblioteca em um arquivo e, em seguida, fazer refer\u00eancia ao arquivo na fun\u00e7\u00e3o <\/span><em><span style=\"font-weight: 400\">-data-binary<\/span><\/em><span style=\"font-weight: 400\"> (ou <\/span><em><span style=\"font-weight: 400\">-d<\/span><\/em><span style=\"font-weight: 400\">), prefixando com um argumento \"<em>@<\/em>\", por exemplo:<\/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 Administrator:password \u2013data-binary '@path\/to\/file'<\/pre>\n<p><span style=\"font-weight: 400\">Onde sua biblioteca seria salva em path\/to\/file.<\/span><\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p><span style=\"font-weight: 400\">Esta breve postagem mostra como essas novas op\u00e7\u00f5es de armazenamento oferecem flexibilidade na maneira de gerenciar hierarquicamente o c\u00f3digo que voc\u00ea cria e implanta. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Uma \u00faltima atualiza\u00e7\u00e3o para voc\u00ea: embora existam refer\u00eancias baseadas em c\u00f3digo para o termo <em>N1QL<\/em> Nesta s\u00e9rie, nos referimos \u00e0 linguagem de consulta como <em>SQL++<\/em> - uma extens\u00e3o do padr\u00e3o SQL. As consultas no Couchbase geralmente s\u00e3o baseadas em SQL++, permitindo que voc\u00ea aproveite seu conhecimento de consulta SQL padr\u00e3o, mas aplique-o a documentos JSON e muito mais. Daqui para frente, voc\u00ea provavelmente poder\u00e1 trocar o termo <em>N1QL<\/em> para <em>SQL++<\/em> e voc\u00ea estar\u00e1 atualizado.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Obrigado por acompanhar esta s\u00e9rie de t\u00f3picos sobre N1QL e JavaScript. Uma lista resumida dos t\u00f3picos est\u00e1 inclu\u00edda abaixo para sua refer\u00eancia. <\/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\/pt\/sqlplusplus\/\" target=\"_blank\" rel=\"noopener\">SQL++ - A linguagem de consulta de \u00faltima gera\u00e7\u00e3o para gerenciar dados JSON<\/a><\/li>\n<li>S\u00e9rie SQL++\/N1QL para JavaScript e vice-versa:\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\">fun\u00e7\u00f5es<\/a><\/li>\n<li>Processamento de documentos <a href=\"https:\/\/blog.couchbase.com\/from-n1ql-to-javascript-and-back-part-3\/\" target=\"_blank\" rel=\"noopener\">por meio de iteradores<\/a><\/li>\n<li><a href=\"https:\/\/blog.couchbase.com\/from-n1ql-to-javascript-and-back-part-2\/\" target=\"_blank\" rel=\"noopener\">Manipula\u00e7\u00e3o de dados<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/from-n1ql-to-javascript-and-back-part-4\/\" target=\"_blank\" rel=\"noopener\">Tratamento de erros<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/from-n1ql-to-javascript-and-back-part-5\/\" target=\"_blank\" rel=\"noopener\">Declara\u00e7\u00f5es preparadas<\/a><\/li>\n<li>e outros <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/from-n1ql-to-javascript-and-back-part-6\/\" target=\"_blank\" rel=\"noopener\">t\u00f3picos avan\u00e7ados<\/a><\/li>\n<li>Este post, <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/from-n1ql-to-javascript-and-back-part-7\/\" target=\"_blank\" rel=\"noopener\">armazenamento hier\u00e1rquico de biblioteca JavaScript<\/a><\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>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;]<\/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.1 (Yoast SEO v26.1.1) - 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\/pt\/from-n1ql-to-javascript-and-back-part-7\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\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\/pt\/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\":\"pt-BR\",\"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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\",\"@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\/pt\/author\/marcocouchbase-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"From N1QL to JavaScript and Back - Part 7: Hierarchical JavaScript Storage - The Couchbase Blog","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\/pt\/from-n1ql-to-javascript-and-back-part-7\/","og_locale":"pt_BR","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\/pt\/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":"pt-BR","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":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-7\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@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":"Blog do Couchbase","description":"Couchbase, o banco de dados 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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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, arquiteto de software, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@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\/pt\/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":"Em uma vida anterior, Marco foi CTO, f\u00edsico de radia\u00e7\u00e3o, arquiteto de software, administrador de sistemas, DBA, instrutor e faz-tudo na maior cl\u00ednica de radioterapia da It\u00e1lia.\r\n\r\nDepois de mudar de carreira e de pa\u00eds, ele passou mais de duas d\u00e9cadas em v\u00e1rios cargos de suporte e desenvolvimento na Informix, primeiro, e na IBM, depois, antes de finalmente mergulhar de cabe\u00e7a e entrar para a Couchbase, para ajud\u00e1-los a fazer do N1QL um ouro.\r\n\r\nEle \u00e9 detentor de v\u00e1rias patentes e \u00e9 autor de seus pr\u00f3prios projetos de c\u00f3digo aberto."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/13854","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1782"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=13854"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/13854\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13855"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=13854"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=13854"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=13854"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=13854"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}