{"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\/pt\/from-n1ql-to-javascript-and-back-part-6\/","title":{"rendered":"De N1QL para JavaScript e vice-versa - Parte 6: T\u00f3picos avan\u00e7ados"},"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:\/\/www.couchbase.com\/blog\/pt\/from-n1ql-to-javascript-and-back-part-1-introduction\/\" target=\"_blank\" rel=\"noopener\">fun\u00e7\u00f5es<\/a>, processamento de documentos\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/from-n1ql-to-javascript-and-back-part-3\/\" target=\"_blank\" rel=\"noopener\">por meio de iteradores<\/a>,\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/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>e usando <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>. Temos alguns t\u00f3picos mais avan\u00e7ados para abordar antes de passarmos a manipular as bibliotecas JavaScript, como chamar outras fun\u00e7\u00f5es, usar transa\u00e7\u00f5es e RBAC.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Chamada de fun\u00e7\u00f5es<\/span><\/h2>\n<p><span style=\"font-weight: 400\">As fun\u00e7\u00f5es JavaScript podem chamar outras fun\u00e7\u00f5es JavaScript diretamente.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Qualquer instru\u00e7\u00e3o N1QL executada na fun\u00e7\u00e3o chamada ser\u00e1 executada da mesma forma e com exatamente as mesmas limita\u00e7\u00f5es, como se tivesse sido executada na fun\u00e7\u00e3o chamada. Os resultados podem subir e descer livremente a pilha e qualquer exce\u00e7\u00e3o lan\u00e7ada na fun\u00e7\u00e3o chamada descer\u00e1 a pilha at\u00e9 a solicita\u00e7\u00e3o N1QL de chamada (a menos que seja capturada e tratada em algum lugar).<\/span><\/p>\n<p><span style=\"font-weight: 400\">Essa \u00e9 definitivamente uma maneira mais pr\u00e1tica de chamar fun\u00e7\u00f5es do que executar instru\u00e7\u00f5es N1QL que chamam UDFs N1QL. Ao chamar fun\u00e7\u00f5es diretamente em vez de passar por<\/span><span style=\"font-weight: 400\"> <em>EXECUTAR FUN\u00c7\u00c3O<\/em> <\/span><span style=\"font-weight: 400\">voc\u00ea ignora completamente a camada N1QL e economiza todos os recursos necess\u00e1rios para alternar de JavaScript para N1QL e de volta para JavaScript. Isso reduz o custo das trocas de contexto, a necessidade de mover todos os dados por meio de iteradores e n\u00e3o diretamente, e a necessidade de deixar os iteradores abertos durante a chamada.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Execu\u00e7\u00e3o de N1QL que chama fun\u00e7\u00f5es<\/span><\/h2>\n<p><span style=\"font-weight: 400\">H\u00e1 ocasi\u00f5es em que voc\u00ea executar\u00e1 comandos N1QL que chamam os pr\u00f3prios UDFs N1QL e esses UDFs podem muito bem ser fun\u00e7\u00f5es JavaScript.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Isso \u00e9 absolutamente esperado e funciona exatamente da mesma forma que tudo o que descrevemos at\u00e9 agora.<\/span><\/p>\n<p><span style=\"font-weight: 400\">A \u00fanica limita\u00e7\u00e3o da qual voc\u00ea deve estar ciente \u00e9 que, embora qualquer instru\u00e7\u00e3o N1QL que o JavaScript possa executar, ser\u00e1 executada no mesmo servidor que estiver executando a solicita\u00e7\u00e3o principal. Cada chamada de fun\u00e7\u00e3o JavaScript usar\u00e1 um novo worker JavaScript, o que significa que quanto mais chamadas de UDF N1QL aninhadas voc\u00ea fizer, menos workers estar\u00e3o dispon\u00edveis, e a fun\u00e7\u00e3o eventualmente falhar\u00e1 dessa forma:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">function doRecursion() {\r\n\u00a0\u00a0\u00a0\u00a0var q = execute 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\">O que resulta em:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">[\r\n\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\"code\": 10109,\r\n\u00a0\u00a0\u00a0\u00a0\"msg\": \"Error executing function 'doRecursion' (udfblog:doRecursion)\",\r\n\u00a0\u00a0\u00a0\u00a0\"reason\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"details\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Code\": \"\u00a0 \u00a0 var q = N1QL('execute function doRecursion();', {}, true);\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Exception\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"caller\": \"javascript:133\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"code\": 10112,\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"key\": \"function.nested.error\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"message\": \"Error executing function 'doRecursion': 25 nested javascript calls\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Location\": \"functions\/udfblog.js:11\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Stack\": \" \u00a0 at doRecursion (functions\/udfblog.js:11:13)\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"type\": \"Exceptions from JS code\"\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0}\r\n]<\/pre>\n<p><span style=\"font-weight: 400\">O limite de aninhamento n\u00e3o \u00e9 fixo e depende do n\u00famero de trabalhadores JavaScript dispon\u00edveis no momento em que cada chamada aninhada \u00e9 executada. Em termos gerais, quanto mais atividade JavaScript estiver presente no n\u00f3, menor ser\u00e1 esse limite.<\/span><\/p>\n<p><span style=\"font-weight: 400\">No exemplo acima, o n\u00f3 tinha 48 trabalhadores e falhou na 25\u00aa chamada.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">RBAC<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Para executar o N1QL como parte das fun\u00e7\u00f5es JavaScript, o usu\u00e1rio que executa a fun\u00e7\u00e3o precisa ter os privil\u00e9gios adequados para realizar as a\u00e7\u00f5es (<em>inserir<\/em>, <em>selecionar<\/em>...) especificados na fun\u00e7\u00e3o sobre os objetos referenciados pela fun\u00e7\u00e3o.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Como a identidade do usu\u00e1rio que executa a fun\u00e7\u00e3o n\u00e3o \u00e9 conhecida at\u00e9 o momento da execu\u00e7\u00e3o, quaisquer erros de privil\u00e9gio s\u00f3 ser\u00e3o levantados quando a fun\u00e7\u00e3o for executada, supondo que o usu\u00e1rio que executa a fun\u00e7\u00e3o tenha recebido privil\u00e9gio para executar fun\u00e7\u00f5es JavaScript em primeiro lugar!<\/span><\/p>\n<p><span style=\"font-weight: 400\">Isso est\u00e1 de acordo com o que outros mecanismos de banco de dados fazem.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Efeitos colaterais<\/span><\/h2>\n<p><span style=\"font-weight: 400\">As fun\u00e7\u00f5es executadas como parte de express\u00f5es n\u00e3o podem ter efeitos colaterais, o que significa que nenhuma DML pode ser executada como parte dessa fun\u00e7\u00e3o. Isso est\u00e1 de acordo com o que outros mecanismos de banco de dados fazem e faz sentido. Voc\u00ea n\u00e3o gostaria que uma fun\u00e7\u00e3o <em>SELECIONAR<\/em> para inserir dados nas suas costas por meio do uso de uma fun\u00e7\u00e3o JavaScript.<\/span><\/p>\n<p><span style=\"font-weight: 400\">A \u00fanica maneira de fazer com que as fun\u00e7\u00f5es manipulem o armazenamento \u00e9 execut\u00e1-las isoladamente por meio do <em>EXECUTAR FUN\u00c7\u00c3O<\/em> declara\u00e7\u00e3o.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Transa\u00e7\u00f5es<\/span><\/h2>\n<p><span style=\"font-weight: 400\">\u00c9 perfeitamente legal executar instru\u00e7\u00f5es N1QL transacionais dentro de uma fun\u00e7\u00e3o JavaScript, desde que a fun\u00e7\u00e3o esteja sendo executada com a capacidade de ter efeitos colaterais, ou seja, por meio da fun\u00e7\u00e3o <\/span><em><span style=\"font-weight: 400\">EXECUTAR FUN\u00c7\u00c3O<\/span><\/em><span style=\"font-weight: 400\"> declara\u00e7\u00e3o. <\/span><span style=\"font-weight: 400\">A fun\u00e7\u00e3o pode executar DML em uma transa\u00e7\u00e3o que tenha sido iniciada antes da execu\u00e7\u00e3o da fun\u00e7\u00e3o, pode iniciar a transa\u00e7\u00e3o, pode confirmar ou reverter a transa\u00e7\u00e3o ou qualquer combina\u00e7\u00e3o legal dessas op\u00e7\u00f5es.<\/span><\/p>\n<p><span style=\"font-weight: 400\">A \u00fanica coisa que voc\u00ea precisa ter em mente \u00e9 que as instru\u00e7\u00f5es e os iteradores do N1QL s\u00f3 vivem inteiramente dentro ou fora de uma transa\u00e7\u00e3o, mas n\u00e3o no meio do caminho. <\/span><span style=\"font-weight: 400\">Isso significa que, se voc\u00ea tiver iniciado um comando select antes de uma transa\u00e7\u00e3o, mas n\u00e3o tiver consumido todos os valores, assim que a transa\u00e7\u00e3o for iniciada, esse iterador ser\u00e1 fechado. <\/span><span style=\"font-weight: 400\">O mesmo se aplica \u00e0s instru\u00e7\u00f5es DML que retornam resultados (elas s\u00e3o conclu\u00eddas antes que a transa\u00e7\u00e3o possa ser iniciada), e um comportamento semelhante \u00e9 aplicado quando uma transa\u00e7\u00e3o \u00e9 confirmada ou revertida.<\/span><\/p>\n<p><span style=\"font-weight: 400\">H\u00e1 bons motivos para isso, e o comportamento \u00e9 geralmente consistente com o que acontece com os mecanismos de banco de dados. <\/span><span style=\"font-weight: 400\">A justificativa \u00e9 que, se permit\u00edssemos que os comandos sobrevivessem aos limites da transa\u00e7\u00e3o, os comandos select n\u00e3o poderiam acessar as altera\u00e7\u00f5es da transa\u00e7\u00e3o e os comandos DML n\u00e3o poderiam fazer a revers\u00e3o completa.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Para evitar d\u00favidas, voc\u00ea n\u00e3o pode iniciar uma transa\u00e7\u00e3o dentro de um loop que processa um <em>SELECIONAR<\/em> pois o iterador seria fechado assim que a transa\u00e7\u00e3o fosse iniciada.\u00a0<\/span><span style=\"font-weight: 400\">Toda a parte externa <em>SELECIONAR<\/em> deve estar dentro da transa\u00e7\u00e3o.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Conclus\u00e3o<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Com este blog, abordamos os principais t\u00f3picos relacionados \u00e0 execu\u00e7\u00e3o do N1QL dentro de fun\u00e7\u00f5es JavaScript.\u00a0<\/span><span style=\"font-weight: 400\">O pr\u00f3ximo blog se concentrar\u00e1 nos novos recursos do gerenciamento 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.1 (Yoast SEO v26.1.1) - 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\/pt\/from-n1ql-to-javascript-and-back-part-6\/\" \/>\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 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\/pt\/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\":\"pt-BR\",\"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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"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 6: Advanced Topics","description":"Dando continuidade \u00e0 nossa s\u00e9rie, abordaremos alguns conceitos de uso avan\u00e7ado que abrangem fun\u00e7\u00f5es JavaScript que chamam fun\u00e7\u00f5es, RBAC, transa\u00e7\u00f5es e muito mais.","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-6\/","og_locale":"pt_BR","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\/pt\/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":"pt-BR","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":"Dando continuidade \u00e0 nossa s\u00e9rie, abordaremos alguns conceitos de uso avan\u00e7ado que abrangem fun\u00e7\u00f5es JavaScript que chamam fun\u00e7\u00f5es, RBAC, transa\u00e7\u00f5es e muito mais.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-6\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@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":"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\/13785","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=13785"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/13785\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13080"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=13785"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=13785"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=13785"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=13785"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}