{"id":13635,"date":"2022-08-04T16:02:15","date_gmt":"2022-08-04T23:02:15","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=13635"},"modified":"2025-06-13T17:20:44","modified_gmt":"2025-06-14T00:20:44","slug":"from-n1ql-to-javascript-and-back-part-3","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/from-n1ql-to-javascript-and-back-part-3\/","title":{"rendered":"De N1QL para JavaScript e vice-versa - Parte 3: Itera\u00e7\u00e3o sobre documentos e DML"},"content":{"rendered":"<p><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/from-n1ql-to-javascript-and-back-part-2\/\" target=\"_blank\" rel=\"noopener\"><span style=\"font-weight: 400;\">Este blog anterior<\/span><\/a><span style=\"font-weight: 400;\"> aborda os conceitos b\u00e1sicos da execu\u00e7\u00e3o de instru\u00e7\u00f5es N1QL dentro de fun\u00e7\u00f5es JavaScript.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Passamos agora para...<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Iteradores\/processamento de valores<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">At\u00e9 agora, evitamos propositalmente declara\u00e7\u00f5es que retornam dados e que retornam dados da fun\u00e7\u00e3o.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00c9 aqui que come\u00e7amos a explorar a coleta de dados.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O <em>N1QL()<\/em> referenciada diretamente ou por meio da m\u00e1gica do transpilador, retorna um identificador de declara\u00e7\u00e3o. O identificador vem na forma de um objeto JavaScript e tem um iterador associado, por exemplo:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">\u00a0\u00a0\u00a0\u00a0var q = SELECT * FROM b1;<\/pre>\n<p><span style=\"font-weight: 400;\">N\u00e3o vou gastar muito tempo descrevendo os iteradores, portanto, aqui est\u00e3o os conceitos b\u00e1sicos:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Voc\u00ea pode obter o pr\u00f3ximo valor de um iterador usando a fun\u00e7\u00e3o <\/span><span style=\"font-weight: 400;\">pr\u00f3ximo()<\/span><span style=\"font-weight: 400;\"> m\u00e9todo.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">O <\/span><span style=\"font-weight: 400;\">feito<\/span><span style=\"font-weight: 400;\"> A propriedade \u00e9 verdadeira se n\u00e3o houver mais documentos a serem obtidos.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Embora voc\u00ea possa usar a fun\u00e7\u00e3o <\/span><em><span style=\"font-weight: 400;\">pr\u00f3ximo()<\/span><\/em><span style=\"font-weight: 400;\"> e <\/span><em><span style=\"font-weight: 400;\">feito<\/span><\/em><span style=\"font-weight: 400;\"> em um loop while para obter todos os documentos, uma constru\u00e7\u00e3o mais leg\u00edvel \u00e9 o <\/span><em><span style=\"font-weight: 400;\">para...de<\/span><\/em><span style=\"font-weight: 400;\"> loop sobre o pr\u00f3prio identificador da declara\u00e7\u00e3o.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Nem todos os valores precisam ser recuperados - voc\u00ea pode descartar uma declara\u00e7\u00e3o a qualquer momento chamando a fun\u00e7\u00e3o <\/span><em><span style=\"font-weight: 400;\">fechar()<\/span><\/em><span style=\"font-weight: 400;\"> embora, como veremos mais adiante, voc\u00ea n\u00e3o precise fazer isso.<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Juntando tudo:<\/span><br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-13636 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/08\/image_2022-08-04_152817169.png\" alt=\"Basics of iterators in N1QL\/JavaScript and Couchbase\" width=\"655\" height=\"215\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/image_2022-08-04_152817169.png 655w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/image_2022-08-04_152817169-300x98.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/image_2022-08-04_152817169-20x7.png 20w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><br \/>\n<span style=\"font-weight: 400;\">e a fun\u00e7\u00e3o correspondente:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">CREATE FUNCTION doSelect() LANGUAGE JAVASCRIPT AS \"doSelect\" AT \"udfblog\";<\/pre>\n<p><span style=\"font-weight: 400;\">Neste exemplo, uma matriz chamada <\/span><em><span style=\"font-weight: 400;\">res<\/span><\/em><span style=\"font-weight: 400;\"> acumula os documentos que obtemos de <\/span><span style=\"font-weight: 400;\"><em>b1<\/em> <\/span><span style=\"font-weight: 400;\">atrav\u00e9s do iterador <\/span><em><span style=\"font-weight: 400;\">q<\/span><\/em><span style=\"font-weight: 400;\">e, em seguida, \u00e9 usado para devolv\u00ea-los ao chamador.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Algumas observa\u00e7\u00f5es<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Em termos gerais, provavelmente \u00e9 uma ideia melhor processar os valores de consulta \u00e0 medida que s\u00e3o recebidos no <\/span><span style=\"font-weight: 400;\">para<\/span><span style=\"font-weight: 400;\"> em vez de apenas acumul\u00e1-los em uma matriz, pois isso tem implica\u00e7\u00f5es transit\u00f3rias no uso da mem\u00f3ria.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Por outro lado, o retorno de um valor de matriz de uma fun\u00e7\u00e3o permite que uma instru\u00e7\u00e3o selecione a fun\u00e7\u00e3o, por exemplo:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">SELECT * FROM doSelect() AS funcDocs;<\/pre>\n<p><span style=\"font-weight: 400;\">Isso \u00e9 muito parecido com o que voc\u00ea faria com as fun\u00e7\u00f5es de tabela ou tabelas derivadas de cole\u00e7\u00e3o que voc\u00ea encontrou no mundo relacional.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">No mundo N1QL, eles s\u00e3o conhecidos como <\/span><i><span style=\"font-weight: 400;\">exames de express\u00e3o<\/span><\/i><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\u00c9 claro que, se tudo o que voc\u00ea deseja que sua fun\u00e7\u00e3o fa\u00e7a \u00e9 retornar alguns documentos de um<\/span><i><span style=\"font-weight: 400;\"> Espa\u00e7o-chave<\/span><\/i><span style=\"font-weight: 400;\"> sem nenhuma l\u00f3gica adicional, provavelmente \u00e9 melhor escrever uma fun\u00e7\u00e3o inline.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">De volta ao iterador!<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Quando voc\u00ea terminar de processar os valores, o iterador se fechar\u00e1 automaticamente, portanto, n\u00e3o h\u00e1 nada que voc\u00ea precise fazer.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Se o iterador n\u00e3o for drenado, \u00e9 uma boa pr\u00e1tica fech\u00e1-lo, embora isso n\u00e3o seja estritamente necess\u00e1rio, pois ele ser\u00e1 fechado automaticamente quando a fun\u00e7\u00e3o retornar, bem como em outras circunst\u00e2ncias, como veremos mais adiante.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Dentro do <\/span><span style=\"font-weight: 400;\"><em>para ... de<\/em> ...<\/span><span style=\"font-weight: 400;\"> \u00e9 perfeitamente v\u00e1lido ter outras instru\u00e7\u00f5es N1QL: alguns aspectos a serem considerados ser\u00e3o descritos em se\u00e7\u00f5es posteriores.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Valores de processamento<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">Vamos tentar usar os valores retornados pelo select, em vez de apenas retorn\u00e1-los:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">function doSelect() {\r\n\u00a0\u00a0\u00a0\u00a0var q = SELECT * FROM b1 LIMIT 2;\r\n\u00a0\u00a0\u00a0\u00a0var res = [];\r\n\u00a0\u00a0\u00a0\u00a0for (const doc of q) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let f1 = doc.f1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0res.push(f1);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0return res;\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Nada particularmente sofisticado, apenas extrair um campo do documento.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A execu\u00e7\u00e3o dessa fun\u00e7\u00e3o produz:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">[\r\n\u00a0\u00a0[\r\n\u00a0\u00a0\u00a0\u00a0null,\r\n\u00a0\u00a0\u00a0\u00a0null\r\n\u00a0\u00a0]\r\n]<\/pre>\n<p><span style=\"font-weight: 400;\">O que acontece? Por que ele n\u00e3o retorna? <em>f1<\/em>?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Podemos adivinhar a resposta executando:<\/span><\/p>\n<pre class=\"lang:default decode:true\">SELECT * FROM b1 LIMIT 2<\/pre>\n<p><span style=\"font-weight: 400;\">E vendo, na interface do usu\u00e1rio:<\/span><\/p>\n<pre class=\"lang:js decode:true\">[\r\n\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\"b1\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"f1\": 1\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0},\r\n\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\"b1\": {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"f1\": 2\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0}\r\n]<\/pre>\n<p><em><span style=\"font-weight: 400;\">f1<\/span><\/em><span style=\"font-weight: 400;\"> \u00e9 um campo em <\/span><em><span style=\"font-weight: 400;\">b1<\/span><\/em><span style=\"font-weight: 400;\">e n\u00e3o o documento selecionado!<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Qualquer um deles faz o que voc\u00ea deseja:<\/span><\/p>\n<pre class=\"lang:js decode:true\">function doSelect() {\r\n\u00a0\u00a0\u00a0\u00a0var q = SELECT * FROM b1 LIMIT 2;\r\n\u00a0\u00a0\u00a0\u00a0var res = [];\r\n\u00a0\u00a0\u00a0\u00a0for (const doc of q) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let f1 = doc.b1.f1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0res.push(f1);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0return res;\r\n}<\/pre>\n<pre class=\"lang:js decode:true\">function doSelect() {\r\n\u00a0\u00a0\u00a0\u00a0var q = SELECT raw b1 FROM b1 LIMIT 2;\r\n\u00a0\u00a0\u00a0\u00a0var res = [];\r\n\u00a0\u00a0\u00a0\u00a0for (const doc of q) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let f1 = doc.f1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0res.push(f1);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0return res;\r\n}\r\n\r\nfunction doSelect() {\r\n\u00a0\u00a0\u00a0\u00a0var q = SELECT f1 FROM b1 LIMIT 2;\r\n\u00a0\u00a0\u00a0\u00a0var res = [];\r\n\u00a0\u00a0\u00a0\u00a0for (const doc of q) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0let f1 = doc.f1;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0res.push(f1);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0return res;\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<h2><span style=\"color: #343e47; font-family: Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 50px;\">Declara\u00e7\u00f5es DML<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Considere a seguinte fun\u00e7\u00e3o:<\/span><\/p>\n<pre class=\"lang:js decode:true\">function doCopy() {\r\n\u00a0\u00a0\u00a0\u00a0var q1 = INSERT INTO b1 (KEY UUID(), VALUE v) SELECT b1 AS v FROM b1;\r\n\u00a0\u00a0\u00a0\u00a0var q2 = DELETE FROM b1 WHERE LENGTH(meta().id) = 2;\r\n}<\/pre>\n<pre class=\"lang:default decode:true\">CREATE FUNCTION doCopy() LANGUAGE JAVASCRIPT AS \"doCopy\" AT \"udfblog\"<\/pre>\n<p><span style=\"font-weight: 400;\">Essa fun\u00e7\u00e3o cria novos documentos em <em>b1<\/em> copiando-os de documentos existentes e removendo os documentos antigos.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O fato de que <\/span><em><span style=\"font-weight: 400;\">q1<\/span><\/em><span style=\"font-weight: 400;\"> e <\/span><em><span style=\"font-weight: 400;\">q2<\/span><\/em><span style=\"font-weight: 400;\"> s\u00e3o iteradores, mesmo quando as instru\u00e7\u00f5es n\u00e3o retornam valores, n\u00e3o deve ser uma grande surpresa: como veremos mais tarde, as instru\u00e7\u00f5es DML podem retornar valores e, pior ainda, o transpilador nem sempre pode determinar se os valores est\u00e3o sendo retornados ou n\u00e3o, da\u00ed o <em>N1QL()<\/em> sempre retorna um iterador.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A implica\u00e7\u00e3o disso \u00e9 que, uma vez que o <em>N1QL()<\/em> a instru\u00e7\u00e3o N1QL pode muito bem estar sendo executada de forma ass\u00edncrona em segundo plano, deixando a fun\u00e7\u00e3o JavaScript livre para executar outro c\u00f3digo antes de buscar os dados.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O <em>jsevaluator<\/em> elimina qualquer ambiguidade comportamental for\u00e7ando as instru\u00e7\u00f5es que n\u00e3o retornam valores a serem executadas imediatamente e em s\u00e9rie, o que significa que ele aguardar\u00e1 a conclus\u00e3o de cada instru\u00e7\u00e3o DML antes de iniciar a pr\u00f3xima instru\u00e7\u00e3o.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Nenhuma a\u00e7\u00e3o no iterador \u00e9 necess\u00e1ria, nem mesmo fech\u00e1-lo.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Isso \u00e9 consistente com o comportamento que esperamos instintivamente: queremos terminar de inserir uma c\u00f3pia dos documentos existentes antes de come\u00e7ar a excluir os antigos - ou talvez n\u00e3o estejamos fazendo uma c\u00f3pia de todos os documentos originais!<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Declara\u00e7\u00f5es DML que retornam valores<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Os comandos DML do N1QL podem ser feitos para retornar valores, como na fun\u00e7\u00e3o abaixo:<\/span><\/p>\n<pre class=\"lang:js decode:true\">function doCopy() {\r\n\u00a0\u00a0\u00a0\u00a0var q1 = INSERT INTO b1 (KEY UUID(), VALUE v) SELECT b1 AS v FROM b1 RETURNING meta().id, b1;\r\n\u00a0\u00a0\u00a0\u00a0var res = []\r\n\u00a0\u00a0\u00a0\u00a0for (const doc of q1) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0res.push(doc);\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0var q2 = DELETE FROM b1 WHERE LENGTH(meta().id) = 2;\r\n\u00a0\u00a0\u00a0\u00a0return res;\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">Os resultados retornados s\u00e3o processados da mesma forma que para <em>SELECIONAR<\/em> declara\u00e7\u00f5es.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A principal diferen\u00e7a em rela\u00e7\u00e3o \u00e0s instru\u00e7\u00f5es DML que n\u00e3o retornam resultados \u00e9 que, quando nenhum resultado \u00e9 retornado, todas as altera\u00e7\u00f5es no disco s\u00e3o feitas assim que a instru\u00e7\u00e3o retorna, ao passo que, quando os resultados s\u00e3o retornados, a instru\u00e7\u00e3o progride \u00e0 medida que cada documento individual \u00e9 coletado do iterador: voc\u00ea precisa processar todos os valores retornados para que todas as altera\u00e7\u00f5es sejam feitas no disco.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Mais uma vez, a instru\u00e7\u00e3o \u00e9 executada de forma ass\u00edncrona; portanto, ao coletar cada resultado individual, voc\u00ea n\u00e3o deve presumir que essa \u00e9 a \u00faltima modifica\u00e7\u00e3o feita no disco: outras podem j\u00e1 ter sido feitas, com os resultados relevantes apenas na fila esperando para serem coletados.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Assim como as instru\u00e7\u00f5es DML que n\u00e3o retornam resultados, as que retornam s\u00e3o executadas em s\u00e9rie, o que significa que, se voc\u00ea n\u00e3o processar todos os resultados enfileirados no iterador at\u00e9 o momento em que iniciar a pr\u00f3xima instru\u00e7\u00e3o, o jsevaluator concluir\u00e1 a instru\u00e7\u00e3o atual descartando todos os valores n\u00e3o processados.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Conclus\u00e3o<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Cobrimos o processamento de documentos por meio do N1QL e a execu\u00e7\u00e3o da manipula\u00e7\u00e3o de dados.<\/span><\/p>\n<p><strong>Em seguida, veremos como lidar com erros.<\/strong><\/p>","protected":false},"excerpt":{"rendered":"<p>This earlier blog goes through the basics of executing N1QL statements inside JavaScript functions. We now move onto\u2026 Iterators\/Processing values So far we have purposely avoided statements that return data, and returning data from the function. This is where we [&hellip;]<\/p>","protected":false},"author":1782,"featured_media":13637,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,9327,1812],"tags":[2133,1543,8911],"ppma_author":[8924],"class_list":["post-13635","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-javascript","category-n1ql-query","tag-functions","tag-javascript","tag-udf"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.5 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>From N1QL to JavaScript and Back - Part 3: Iterating over Documents and DML - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Learn the basics of iterators in N1QL\/Javascript and Couchbase, the corresponding function, processing documents through N1QL and executing data manipulation.\" \/>\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-3\/\" \/>\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 3: Iterating over Documents and DML\" \/>\n<meta property=\"og:description\" content=\"Learn the basics of iterators in N1QL\/Javascript and Couchbase, the corresponding function, processing documents through N1QL and executing data manipulation.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/from-n1ql-to-javascript-and-back-part-3\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-08-04T23:02:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T00:20:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/n1ql-javascript-iterators-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1707\" \/>\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=\"6 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-3\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/\"},\"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 3: Iterating over Documents and DML\",\"datePublished\":\"2022-08-04T23:02:15+00:00\",\"dateModified\":\"2025-06-14T00:20:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/\"},\"wordCount\":949,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/n1ql-javascript-iterators-scaled.jpg\",\"keywords\":[\"functions\",\"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-3\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/\",\"name\":\"From N1QL to JavaScript and Back - Part 3: Iterating over Documents and DML - 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-3\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/n1ql-javascript-iterators-scaled.jpg\",\"datePublished\":\"2022-08-04T23:02:15+00:00\",\"dateModified\":\"2025-06-14T00:20:44+00:00\",\"description\":\"Learn the basics of iterators in N1QL\/Javascript and Couchbase, the corresponding function, processing documents through N1QL and executing data manipulation.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/n1ql-javascript-iterators-scaled.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/n1ql-javascript-iterators-scaled.jpg\",\"width\":2560,\"height\":1707,\"caption\":\"From N1QL to Javascript and back - Part 3: iterating over documents and DML\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/#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 3: Iterating over Documents and DML\"}]},{\"@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 3: Iterating over Documents and DML - The Couchbase Blog","description":"Aprenda os conceitos b\u00e1sicos de iteradores em N1QL\/Javascript e Couchbase, a fun\u00e7\u00e3o correspondente, o processamento de documentos por meio de N1QL e a execu\u00e7\u00e3o da manipula\u00e7\u00e3o de dados.","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-3\/","og_locale":"pt_BR","og_type":"article","og_title":"From N1QL to JavaScript and Back - Part 3: Iterating over Documents and DML","og_description":"Learn the basics of iterators in N1QL\/Javascript and Couchbase, the corresponding function, processing documents through N1QL and executing data manipulation.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/from-n1ql-to-javascript-and-back-part-3\/","og_site_name":"The Couchbase Blog","article_published_time":"2022-08-04T23:02:15+00:00","article_modified_time":"2025-06-14T00:20:44+00:00","og_image":[{"width":2560,"height":1707,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/n1ql-javascript-iterators-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":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/"},"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 3: Iterating over Documents and DML","datePublished":"2022-08-04T23:02:15+00:00","dateModified":"2025-06-14T00:20:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/"},"wordCount":949,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/n1ql-javascript-iterators-scaled.jpg","keywords":["functions","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-3\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/","url":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/","name":"From N1QL to JavaScript and Back - Part 3: Iterating over Documents and DML - 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-3\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/n1ql-javascript-iterators-scaled.jpg","datePublished":"2022-08-04T23:02:15+00:00","dateModified":"2025-06-14T00:20:44+00:00","description":"Aprenda os conceitos b\u00e1sicos de iteradores em N1QL\/Javascript e Couchbase, a fun\u00e7\u00e3o correspondente, o processamento de documentos por meio de N1QL e a execu\u00e7\u00e3o da manipula\u00e7\u00e3o de dados.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/n1ql-javascript-iterators-scaled.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/08\/n1ql-javascript-iterators-scaled.jpg","width":2560,"height":1707,"caption":"From N1QL to Javascript and back - Part 3: iterating over documents and DML"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/from-n1ql-to-javascript-and-back-part-3\/#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 3: Iterating over Documents and DML"}]},{"@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\/13635","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=13635"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/13635\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13637"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=13635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=13635"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=13635"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=13635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}