{"id":13258,"date":"2022-05-26T12:05:50","date_gmt":"2022-05-26T19:05:50","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=13258"},"modified":"2025-06-13T23:34:35","modified_gmt":"2025-06-14T06:34:35","slug":"traverse-hierarchy-user-defined-functions-in-7-1","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/traverse-hierarchy-user-defined-functions-in-7-1\/","title":{"rendered":"Recorrer la jerarqu\u00eda con funciones SQL++ definidas por el usuario (UDF)"},"content":{"rendered":"<p><span style=\"font-weight: 400\">Las funciones definidas por el usuario (UDF) son una caracter\u00edstica que existe en la mayor\u00eda de los RDBMS. Ya se trate de Oracle PL\/SQL (Procedural Language for SQL), SQL Server T-SQL (Transact-SQL), PL\/pgSQL (Procedural Language\/PostgreSQL) u otras variantes, todos estos lenguajes tienen las caracter\u00edsticas generales de proporcionar<\/span><span style=\"font-weight: 400\"> una estructura de bloques, control de condiciones, bucle de iteraci\u00f3n y gesti\u00f3n de errores. Estos bloques permiten desarrollar tareas complejas, que pueden aislarse para mejorar el mantenimiento y la integridad de la aplicaci\u00f3n.<\/span><\/p>\n<p><span style=\"font-weight: 400\">En el caso de Couchbase, los criterios a la hora de elegir el idioma para <a href=\"https:\/\/www.couchbase.com\/blog\/es\/sqlplusplus\/\">SQL<\/a> Las Funciones Definidas por el Usuario son bastante claras - deben ser capaces de soportar todas las capacidades que existen en las implementaciones RDBMS actuales o al mismo nivel que el servicio Couchbase Query puede, y tambi\u00e9n reflejar la preferencia de los desarrolladores de hoy en d\u00eda. Seg\u00fan las encuestas a desarrolladores de Stack Overflow, el lenguaje de programaci\u00f3n m\u00e1s utilizado en el mundo en 2020 es <\/span><b>JavaScript<\/b><span style=\"font-weight: 400\">.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">SQL++ UDF\/JS<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Couchbase es una base de datos de documentos que almacena sus datos de forma nativa en formato JSON (<\/span><b>J<\/b><span style=\"font-weight: 400\">ava<\/span><b>S<\/b><span style=\"font-weight: 400\">cript <\/span><b>O<\/b><span style=\"font-weight: 400\">bjeto <\/span><b>N<\/b><span style=\"font-weight: 400\">otaci\u00f3n). Su lenguaje de consulta, SQL++ , es <em>SQL para JSON<\/em>. El lenguaje JavaScript es, por tanto, la forma m\u00e1s natural de acceder y manipular datos JSON.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Consulte la documentaci\u00f3n de Couchbase para obtener m\u00e1s informaci\u00f3n sobre la funci\u00f3n <a href=\"https:\/\/docs.couchbase.com\/server\/current\/eventing\/eventing-language-constructs.html\" target=\"_blank\" rel=\"noopener\">implementaci\u00f3n completa de JavaScript en Couchbase<\/a>.<\/span><\/p>\n<h3><span style=\"font-weight: 400\">La UDF de JavaScript para recorrer \u00e1rboles<\/span><\/h3>\n<p><span style=\"font-weight: 400\">JavaScript es potente, flexible y relativamente f\u00e1cil de empezar a utilizar. Para mostrar su versatilidad, he creado una UDF Javascript para este art\u00edculo que atraviesa una estructura de \u00e1rbol, como una estructura organizativa.<\/span><\/p>\n<p>UDF: <em>traverseTree<\/em><\/p>\n<p><span style=\"font-weight: 400\">La UDF realiza una b\u00fasqueda recursiva en una colecci\u00f3n utilizando las dos <em>conecte<\/em> (hacia y desde) para la recursi\u00f3n.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Los par\u00e1metros se muestran en la siguiente tabla:<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>#<\/strong><\/td>\n<td><strong>Nombre<\/strong><\/td>\n<td><strong>Descripci\u00f3n<\/strong><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">1<\/span><\/td>\n<td><i><span style=\"font-weight: 400\">kSpace<\/span><\/i><\/td>\n<td><span style=\"font-weight: 400\">El espacio clave para la consulta. Puede ser una colecci\u00f3n o una consulta.<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">2<\/span><\/td>\n<td><i><span style=\"font-weight: 400\">startWith<\/span><\/i><\/td>\n<td><span style=\"font-weight: 400\">Inicia la b\u00fasqueda con este valor para el connectToFld. Si est\u00e1 vac\u00edo, la b\u00fasqueda se realizar\u00e1 para todos los valores connectTo<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">3<\/span><\/td>\n<td><i><span style=\"font-weight: 400\">connectTo<\/span><\/i><\/td>\n<td><span style=\"font-weight: 400\">El nombre del campo de la colecci\u00f3n donde se utilizar\u00e1 el campo connectTo<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">4<\/span><\/td>\n<td><i><span style=\"font-weight: 400\">connectFrom<\/span><\/i><\/td>\n<td><span style=\"font-weight: 400\">El nombre del campo de la colecci\u00f3n donde se utilizar\u00e1 el campo connectFrom<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">5<\/span><\/td>\n<td><i><span style=\"font-weight: 400\">informeHier<\/span><\/i><\/td>\n<td><span style=\"font-weight: 400\">El nombre del campo de la matriz jer\u00e1rquica<\/span><\/td>\n<\/tr>\n<tr>\n<td><span style=\"font-weight: 400\">6<\/span><\/td>\n<td><i><span style=\"font-weight: 400\">logKSpace<\/span><\/i><\/td>\n<td><span style=\"font-weight: 400\">El espacio clave donde se escribe el registro opcional para UDF. Tenga en cuenta que este par\u00e1metro s\u00f3lo se puede ejecutar cuando se ejecuta con EXECUTE FUNCTION.<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4><span style=\"font-weight: 400\">Ejemplos de jerarqu\u00eda<\/span><\/h4>\n<p><span style=\"font-weight: 400\">Consideremos una estructura jer\u00e1rquica organizativa como la siguiente.<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13260\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/05\/traverse-org-chart-json-sql.png\" alt=\"traverse hierarchical data example\" width=\"307\" height=\"192\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/traverse-org-chart-json-sql.png 307w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/traverse-org-chart-json-sql-300x188.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/traverse-org-chart-json-sql-20x13.png 20w\" sizes=\"auto, (max-width: 307px) 100vw, 307px\" \/><\/p>\n<p><span style=\"font-weight: 400\">En <\/span><em><span style=\"font-weight: 400\">emp<\/span><\/em><span style=\"font-weight: 400\"> La colecci\u00f3n cuenta con los siguientes documentos:<\/span><\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">[\r\n  { \"empid\": 1, \"name\": \"JeffC\" },\r\n  { \"empid\": 2, \"name\": \"SteveA\", \"reportsTo\": \"JeffC\" },\r\n  { \"empid\": 3, \"name\": \"AmitG\", \"reportsTo\": \"JeffC\" },\r\n  { \"empid\": 4, \"name\": \"BrendaM\", \"reportsTo\": \"SteveA\" },\r\n  { \"empid\": 5, \"name\": \"WillG\", \"reportsTo\": \"SteveA\" },\r\n  { \"empid\": 6, \"name\": \"PaulD\", \"reportsTo\": \"BrendaM\" }\r\n]<\/pre>\n<pre class=\"decode-attributes:false lang:default decode:true\">SELECT e.* FROM traverseTree('traversal.hierarchy.emp','','name','reportsTo','ReportHierarchy','') e;<\/pre>\n<p>La consulta produce los siguientes resultados:<\/p>\n<pre class=\"decode-attributes:false lang:js decode:true\">[\r\n  {\r\n    \"ReportHierarchy\": [],\r\n   \"nombre\": \"JeffC\"\r\n  },\r\n  {\r\n    \"ReportHierarchy\": [ { \"level\": 1, \"name\": \"JeffC\" } ],\r\n   \"name\": \"SteveA\",\r\n    \"reportsTo\": \"JeffC\"\r\n  },\r\n  {\r\n    \"ReportHierarchy\": [ { \"level\": 1, \"name\": \"JeffC\" } ],\r\n   \"name\": \"AmitG\",\r\n    \"reportsTo\": \"JeffC\"\r\n  },\r\n  {\r\n    \"ReportHierarchy\": [ {\"level\": 1, \"name\": \"SteveA\", \"reportsTo\": \"JeffC\" },\r\n                        { \"level\": 2 2, \"name\": \"JeffC\" }  ],\r\n    \"name\": \"BrendaM\",\r\n    \"reportsTo\": \"SteveA\"\r\n  },\r\n  {\r\n    \"ReportHierarchy\": [ {\"level\": 1, \"name\": \"SteveA\", \"reportsTo\": \"JeffC\" },\r\n                        { \"level\": 2 2, \"name\": \"JeffC\" }  ],\r\n    \"name\": \"WillG\",\r\n    \"reportsTo\": \"SteveA\"\r\n  },\r\n  {\r\n    \"ReportHierarchy\": [ {\"level\": 1, \"name\": \"BrendaM\", \"reportsTo\": \"SteveA\" },\r\n                        { \"level\": 2 2, \"name\": \"SteveA\", \"reportsTo\": \"JeffC\" },\r\n                        { \"level\": 3 3, \"name\": \"JeffC\" }  ],\r\n   \"name\": \"PaulD\",\r\n    \"reportsTo\": \"BrendaM\"\r\n  }\r\n]\r\n<\/pre>\n<h3><span style=\"font-weight: 400\">Crear el <\/span><em><span style=\"font-weight: 400\">traverseTree<\/span><\/em><span style=\"font-weight: 400\"> funci\u00f3n definida por el usuario<\/span><\/h3>\n<p><span style=\"font-weight: 400\">En Couchbase SQL++, una UDF puede definirse de varias maneras.\u00a0<\/span><\/p>\n<h5>UDF como funci\u00f3n escalar<\/h5>\n<pre class=\"decode-attributes:false lang:default decode:true\">CREATE FUNCTION to_meters(...) { args[0] * 0.3048 };\r\n\r\nSELECT nombre_aeropuerto, ROUND(to_meters(geo.alt)) AS mamsl\r\nFROM `viajes-muestra`.inventario.aeropuerto\r\nLIMIT 5;<\/pre>\n<p>&nbsp;<\/p>\n<h5>Como funci\u00f3n en l\u00ednea con una subconsulta<\/h5>\n<pre class=\"decode-attributes:false lang:default decode:true\">CREAR FUNCI\u00d3N locations(vActivity) { (\r\n  SELECT id, nombre, direcci\u00f3n, ciudad\r\n  FROM `viaje-muestra`.inventario.localizacion\r\n  WHERE actividad = vActividad) };\r\n\r\nSELECT l.nombre, l.ciudad\r\nFROM locations(\"comer\") AS l\r\nWHERE l.city = \"Gillingham\";<\/pre>\n<p>&nbsp;<\/p>\n<h5>Definida como una funci\u00f3n externa<\/h5>\n<p><span style=\"font-weight: 400\">En <em>traverseTree<\/em> UDF utiliza el mecanismo de funci\u00f3n externa. Pero en este caso, proporcionamos la biblioteca de c\u00f3digo externo para la funci\u00f3n. Consulta la documentaci\u00f3n de Couchbase para m\u00e1s detalles sobre <a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/userfun.html\" target=\"_blank\" rel=\"noopener\">Funci\u00f3n externa<\/a>.<\/span><\/p>\n<p><span style=\"font-weight: 400\">A continuaci\u00f3n se explica c\u00f3mo crear una biblioteca de funciones JavaScript:<\/span><\/p>\n<p><b>1- Crear la biblioteca de funciones<\/b><span style=\"font-weight: 400\"> - En este ejemplo, utilizamos Query Workbench para crear la biblioteca JavaScript.\u00a0<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13261\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/05\/image2-2-1024x235.png\" alt=\"Managing JavaScript function libraries\" width=\"900\" height=\"207\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image2-2-1024x235.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image2-2-300x69.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image2-2-768x177.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image2-2-1536x353.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image2-2-20x5.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image2-2-1320x304.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image2-2.png 1948w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<p><b>2 - A\u00f1adir y editar el c\u00f3digo JavaScript<\/b><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-13262\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/05\/image4.png\" alt=\"Editing Couchbase JavaScript code\" width=\"646\" height=\"416\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image4.png 646w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image4-300x193.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image4-20x13.png 20w\" sizes=\"auto, (max-width: 646px) 100vw, 646px\" \/><\/p>\n<p><span style=\"font-weight: 400\">Consulte este [<\/span><a href=\"https:\/\/github.com\/binhquocle\/Coding\/blob\/master\/udfs\/tree.js\"><span style=\"font-weight: 400\">enlace<\/span><\/a><span style=\"font-weight: 400\">] para ver el c\u00f3digo completo de la biblioteca JavaScript de traverseTree.<\/span><\/p>\n<p><b>3 - Crear la funci\u00f3n SQL++ definida por el usuario<\/b><span style=\"font-weight: 400\">\u00a0<\/span><\/p>\n<pre class=\"decode-attributes:false lang:default decode:true\">CREAR FUNCI\u00d3N traverseTree(kSpace,startWith, connectTo,\r\n                            connectFrom,reportHier, debugKSpace)\r\n  LANGUAGE JAVASCRIPT AS \"traverseTree\" AT \"tree\";<\/pre>\n<p>Tenga en cuenta que tambi\u00e9n puede crear la UDF utilizando el Query Workbench.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-13263\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/05\/image1-3-1024x386.png\" alt=\"Add UDF function in SQL++\" width=\"900\" height=\"339\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image1-3-1024x386.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image1-3-300x113.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image1-3-768x289.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image1-3-1536x579.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image1-3-20x8.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image1-3-1320x497.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/05\/image1-3.png 1954w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/p>\n<h3><span style=\"font-weight: 400\">Notas importantes<\/span><\/h3>\n<p><span style=\"font-weight: 400\">Couchbase 7.0 a\u00f1adi\u00f3 SQL++ UDFs para JavaScript. A Couchbase 7.1 a\u00f1adimos la capacidad de ejecutar SQL++ DMLs desde dentro del c\u00f3digo JavaScript. Tambi\u00e9n hay varias mejoras en el Query Workbench UI para el manejo de UDFs.<\/span><\/p>\n<p><b>Descargo de responsabilidad <\/b><span style=\"font-weight: 400\">- Tenga en cuenta que el c\u00f3digo JavaScript proporcionado en este art\u00edculo no es parte del producto Couchase. Se proporciona aqu\u00ed s\u00f3lo para ilustrar las capacidades de SQL++ UDF usando JavaScript. Se anima a los usuarios a verificar su correcci\u00f3n y a realizar modificaciones para adaptarlo a sus necesidades.<\/span><\/p>\n<h3>Seguir aprendiendo<\/h3>\n<ul>\n<li style=\"list-style-type: none\">\n<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/?family=couchbase-server\" target=\"_blank\" rel=\"noopener\">Descargar Couchbase 7.1<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/whats-new-in-couchbase-server-7-1\/\" target=\"_blank\" rel=\"noopener\">Novedades de Couchbase 7.1<\/a><\/li>\n<li><span style=\"font-weight: 400\"><a href=\"https:\/\/github.com\/binhquocle\/Coding\/blob\/master\/udfs\/tree.js\" target=\"_blank\" rel=\"noopener\">Biblioteca JavaScript traverseTree completa (c\u00f3digo)<\/a><\/span><\/li>\n<li><span style=\"font-weight: 400\"><a href=\"https:\/\/docs.couchbase.com\/server\/current\/eventing\/eventing-language-constructs.html\" target=\"_blank\" rel=\"noopener\">Construcciones del lenguaje de eventos JavaScript (docs)<\/a><\/span><\/li>\n<li><span style=\"font-weight: 400\"><a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/userfun.html\" target=\"_blank\" rel=\"noopener\">Definici\u00f3n de funciones externas en SQL++ (docs)<\/a><\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>User-defined functions (UDFs) are a feature that exist in most RDBMS. Whether it is Oracle PL\/SQL (Procedural Language for SQL), SQL Server T-SQL (Transact-SQL), PL\/pgSQL (Procedural Language\/PostgreSQL), or other variants, all these languages have the general characteristics of providing a [&hellip;]<\/p>","protected":false},"author":26326,"featured_media":12473,"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":[9622,1543,8911],"ppma_author":[8919],"class_list":["post-13258","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-javascript","category-n1ql-query","tag-hierarchical-data","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>Traverse Hierarchy with SQL++ User-defined functions (UDFs)<\/title>\n<meta name=\"description\" content=\"In Couchbase 7.1 you can now execute SQL++ DMLs from within the JavaScript UDF code shown in this hierarchy traversal example.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/traverse-hierarchy-user-defined-functions-in-7-1\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Traverse Hierarchy with SQL++ User-defined functions (UDFs)\" \/>\n<meta property=\"og:description\" content=\"In Couchbase 7.1 you can now execute SQL++ DMLs from within the JavaScript UDF code shown in this hierarchy traversal example.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/traverse-hierarchy-user-defined-functions-in-7-1\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-05-26T19:05:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:34:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/11\/thisisengineering-raeng-64YrPKiguAE-unsplash-1024x683.jpg\" \/>\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\/jpeg\" \/>\n<meta name=\"author\" content=\"Binh Le\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Binh Le\" \/>\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\/traverse-hierarchy-user-defined-functions-in-7-1\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/\"},\"author\":{\"name\":\"Binh Le\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63\"},\"headline\":\"Traverse Hierarchy with SQL++ User-defined functions (UDFs)\",\"datePublished\":\"2022-05-26T19:05:50+00:00\",\"dateModified\":\"2025-06-14T06:34:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/\"},\"wordCount\":642,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/11\/thisisengineering-raeng-64YrPKiguAE-unsplash.jpg\",\"keywords\":[\"hierarchical data\",\"javascript\",\"User Defined Function (UDF)\"],\"articleSection\":[\"Couchbase Server\",\"JavaScript\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/\",\"name\":\"Traverse Hierarchy with SQL++ User-defined functions (UDFs)\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/11\/thisisengineering-raeng-64YrPKiguAE-unsplash.jpg\",\"datePublished\":\"2022-05-26T19:05:50+00:00\",\"dateModified\":\"2025-06-14T06:34:35+00:00\",\"description\":\"In Couchbase 7.1 you can now execute SQL++ DMLs from within the JavaScript UDF code shown in this hierarchy traversal example.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/11\/thisisengineering-raeng-64YrPKiguAE-unsplash.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/11\/thisisengineering-raeng-64YrPKiguAE-unsplash.jpg\",\"width\":7952,\"height\":5304,\"caption\":\"Creating JavaScript UDFs to traverse hierarchy in Couchbase SQL++\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Traverse Hierarchy with SQL++ User-defined functions (UDFs)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63\",\"name\":\"Binh Le\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/5b68c37e30928a9d7b2c8470b1a303b7\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g\",\"caption\":\"Binh Le\"},\"description\":\"Binh Le is a Principal Product Manager for Couchbase Query service. Prior to Couchbase, he worked at Oracle and led the product management team for Sales Cloud Analytics and CRM OnDemand. Binh holds a Bachelor's Degree in Computer Science from the University of Brighton, UK.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/binh-le-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Recorrer la jerarqu\u00eda con funciones SQL++ definidas por el usuario (UDF)","description":"En Couchbase 7.1 ahora puedes ejecutar SQL++ DMLs desde dentro del c\u00f3digo JavaScript UDF mostrado en este ejemplo de jerarqu\u00eda transversal.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/traverse-hierarchy-user-defined-functions-in-7-1\/","og_locale":"es_MX","og_type":"article","og_title":"Traverse Hierarchy with SQL++ User-defined functions (UDFs)","og_description":"In Couchbase 7.1 you can now execute SQL++ DMLs from within the JavaScript UDF code shown in this hierarchy traversal example.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/traverse-hierarchy-user-defined-functions-in-7-1\/","og_site_name":"The Couchbase Blog","article_published_time":"2022-05-26T19:05:50+00:00","article_modified_time":"2025-06-14T06:34:35+00:00","og_image":[{"width":1024,"height":683,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/11\/thisisengineering-raeng-64YrPKiguAE-unsplash-1024x683.jpg","type":"image\/jpeg"}],"author":"Binh Le","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Binh Le","Est. reading time":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/"},"author":{"name":"Binh Le","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63"},"headline":"Traverse Hierarchy with SQL++ User-defined functions (UDFs)","datePublished":"2022-05-26T19:05:50+00:00","dateModified":"2025-06-14T06:34:35+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/"},"wordCount":642,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/11\/thisisengineering-raeng-64YrPKiguAE-unsplash.jpg","keywords":["hierarchical data","javascript","User Defined Function (UDF)"],"articleSection":["Couchbase Server","JavaScript","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/","url":"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/","name":"Recorrer la jerarqu\u00eda con funciones SQL++ definidas por el usuario (UDF)","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/11\/thisisengineering-raeng-64YrPKiguAE-unsplash.jpg","datePublished":"2022-05-26T19:05:50+00:00","dateModified":"2025-06-14T06:34:35+00:00","description":"En Couchbase 7.1 ahora puedes ejecutar SQL++ DMLs desde dentro del c\u00f3digo JavaScript UDF mostrado en este ejemplo de jerarqu\u00eda transversal.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/11\/thisisengineering-raeng-64YrPKiguAE-unsplash.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/11\/thisisengineering-raeng-64YrPKiguAE-unsplash.jpg","width":7952,"height":5304,"caption":"Creating JavaScript UDFs to traverse hierarchy in Couchbase SQL++"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/traverse-hierarchy-user-defined-functions-in-7-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Traverse Hierarchy with SQL++ User-defined functions (UDFs)"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63","name":"Binh Le","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/5b68c37e30928a9d7b2c8470b1a303b7","url":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","caption":"Binh Le"},"description":"Binh Le is a Principal Product Manager for Couchbase Query service. Prior to Couchbase, he worked at Oracle and led the product management team for Sales Cloud Analytics and CRM OnDemand. Binh holds a Bachelor's Degree in Computer Science from the University of Brighton, UK.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/binh-le-2\/"}]}},"authors":[{"term_id":8919,"user_id":26326,"is_guest":0,"slug":"binh-le-2","display_name":"Binh Le","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","author_category":"","last_name":"Le","first_name":"Binh","job_title":"","user_url":"","description":"Binh Le es director de producto principal del servicio de consultas de Couchbase. Antes de Couchbase, trabaj\u00f3 en Oracle y dirigi\u00f3 el equipo de gesti\u00f3n de productos para Sales Clould Analytics y CRM OnDemand. Binh es licenciado en Inform\u00e1tica por la Universidad de Brighton, Reino Unido."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/13258","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/26326"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=13258"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/13258\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/12473"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=13258"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=13258"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=13258"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=13258"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}