{"id":6386,"date":"2019-02-17T19:35:55","date_gmt":"2019-02-18T03:35:55","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=6386"},"modified":"2025-06-13T17:22:10","modified_gmt":"2025-06-14T00:22:10","slug":"n1ql-query-with-self-referencing-hierarchy","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/n1ql-query-with-self-referencing-hierarchy\/","title":{"rendered":"Consulta N1QL com hierarquia de autorrefer\u00eancia"},"content":{"rendered":"<p>Uma constru\u00e7\u00e3o de dados que aparece com frequ\u00eancia em aplicativos de neg\u00f3cios \u00e9 a estrutura de dados hier\u00e1rquica. A hierarquia captura a rela\u00e7\u00e3o pai-filho, muitas vezes entre o mesmo objeto. Por exemplo, a estrutura de uma empresa capta a linha de reporte entre os funcion\u00e1rios. A organiza\u00e7\u00e3o empresarial captura o relacionamento entre as empresas controladoras e as subsidi\u00e1rias. Hierarquias de territ\u00f3rio em vendas. Livro de contas em aplicativos financeiros.<\/p>\n<p>Devido \u00e0 natureza de autorrefer\u00eancia da hierarquia, consultar a estrutura de forma eficiente, juntamente com os dados associados, pode ser um desafio para o RDBMS, especialmente do ponto de vista do desempenho. Neste artigo, discutirei como o RDBMS tradicional lida com consultas hier\u00e1rquicas. Os desafios com os quais ele tem de lidar e como esse problema pode ser tratado de forma semelhante com o Couchbase N1QL e o Couchbase GSI.<\/p>\n<h2>Estrutura hier\u00e1rquica em aplicativos<\/h2>\n<p>O principal motivo para reunir informa\u00e7\u00f5es em uma estrutura hier\u00e1rquica \u00e9 melhorar a compreens\u00e3o das informa\u00e7\u00f5es. A estrutura de relat\u00f3rios da empresa \u00e9 projetada n\u00e3o apenas para ajudar na forma como a organiza\u00e7\u00e3o \u00e9 gerenciada, mas tamb\u00e9m para fornecer uma estrutura para medir e otimizar a efic\u00e1cia de cada grupo. Em uma grande organiza\u00e7\u00e3o, o desempenho de vendas \u00e9 geralmente avaliado, n\u00e3o apenas em n\u00edvel individual, mas tamb\u00e9m em n\u00edvel de equipe de vendas. Em resumo, as empresas organizam as informa\u00e7\u00f5es em uma estrutura hier\u00e1rquica para que possam ter uma melhor compreens\u00e3o do desempenho dos neg\u00f3cios. Para atingir esse objetivo, as empresas precisam de um meio eficiente de consultar os dados hier\u00e1rquicos.<\/p>\n<h3>Representa\u00e7\u00e3o da hierarquia da empresa<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-6402\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/02\/Screen-Shot-2019-02-17-at-7.33.47-PM.png\" alt=\"\" width=\"841\" height=\"428\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-17-at-7.33.47-PM.png 1676w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-17-at-7.33.47-PM-300x153.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-17-at-7.33.47-PM-1024x521.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-17-at-7.33.47-PM-768x390.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-17-at-7.33.47-PM-1536x781.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-17-at-7.33.47-PM-20x10.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-17-at-7.33.47-PM-1320x671.png 1320w\" sizes=\"auto, (max-width: 841px) 100vw, 841px\" \/><\/p>\n<p>Embora o modelo de dados do banco de dados seja capaz de capturar com efici\u00eancia a estrutura hier\u00e1rquica, a dificuldade surge quando voc\u00ea precisa consultar os dados hier\u00e1rquicos e as informa\u00e7\u00f5es relacionadas.<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Considere este requisito:\u00a0<\/strong><\/span><strong>Obter um valor total do pedido de vendas para todos os representantes de vendas que se reportam a ThomasH - VP de vendas<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-6397\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/02\/Screen-Shot-2019-02-16-at-6.16.28-PM.png\" alt=\"\" width=\"879\" height=\"356\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-16-at-6.16.28-PM.png 2098w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-16-at-6.16.28-PM-300x122.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-16-at-6.16.28-PM-1024x415.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-16-at-6.16.28-PM-768x311.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-16-at-6.16.28-PM-1536x622.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-16-at-6.16.28-PM-2048x830.png 2048w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-16-at-6.16.28-PM-20x8.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-16-at-6.16.28-PM-1320x535.png 1320w\" sizes=\"auto, (max-width: 879px) 100vw, 879px\" \/><\/p>\n<p>Embora o modelo de dados seja relativamente simples. A natureza hier\u00e1rquica da organiza\u00e7\u00e3o de vendas sugere uma estrutura din\u00e2mica inerente na hierarquia de relat\u00f3rios. AjayW, que lidera o territ\u00f3rio da Regi\u00e3o 1, tamb\u00e9m gerencia diretamente os membros da equipe de vendas. Por outro lado, na Regi\u00e3o2, Liz L gerencia dois gerentes, que, por sua vez, gerenciam a equipe de vendas. Isso \u00e9 t\u00edpico na maioria das hierarquias de dados de aplicativos.<\/p>\n<h4>Abordagem RDMBS<\/h4>\n<p>Para consultar dados hier\u00e1rquicos, os RDBMS mais estabelecidos, como Oracle e SQLSever, fornecem a constru\u00e7\u00e3o CONNECT BY \/ START WITH para permitir que uma \u00fanica consulta percorra recursivamente a estrutura hier\u00e1rquica de funcion\u00e1rios.<\/p>\n<pre class=\"lang:tsql decode:true\" title=\"RDBMS - Pedidos de vendas gerados por membros que se reportam a ThomasH - VP de vendas\">Query: Sales orders generated by members who report up to ThomasH-Sales VP&lt;\/strong&gt;&lt;\/span&gt;\r\n\r\nSELECT e.EmpID, e.Name, e.ManagerID, sum(o.orderVal)\r\n   FROM employee e\r\n   INNER JOIN sales_order o ON o.EmpID = o.EmpId\r\n   START WITH EmpID = 101\r\n   CONNECT BY PRIOR EmpID = ManagerID\r\n   GROUP BY  e.EmpID, e.Name, e.ManagerID;\r\n\r\n<\/pre>\n<p>Embora a consulta acima possa parecer simples, \u00e9 dif\u00edcil melhorar o desempenho da consulta com \u00edndices devido \u00e0 natureza recursiva da implementa\u00e7\u00e3o do CONNECT BY. Por esse motivo, essa t\u00e9cnica n\u00e3o \u00e9 popular no desenvolvimento de aplicativos para sistemas com grande volume de dados. Em vez disso, os aplicativos corporativos dependem de uma estrutura de objeto pr\u00e9-reformulada para obter um desempenho de consulta mais previs\u00edvel. A t\u00e9cnica de hierarquia achatada \u00e9 descrita na se\u00e7\u00e3o N1QL do Couchbase abaixo.<\/p>\n<h4>Couchbase N1QL<\/h4>\n<p>Para obter o melhor desempenho de consulta, os aplicativos N1QL devem usar a estrutura de hierarquia achatada. A abordagem oferece um desempenho mais previs\u00edvel, al\u00e9m de aproveitar melhor a GSI do Couchbase. O diagrama abaixo mostra um exemplo da transforma\u00e7\u00e3o de achatamento de uma estrutura hier\u00e1rquica de autorrefer\u00eancia, como o objeto employee. Tamb\u00e9m inclu\u00ed um trecho de c\u00f3digo python abaixo que voc\u00ea pode usar para achatar a estrutura hier\u00e1rquica.  A estrutura <strong><em>achatar_hierarquia<\/em><\/strong> usa um objeto JSON hier\u00e1rquico de autorrefer\u00eancia e gera dois novos objetos no mesmo espa\u00e7o de chave, mas com valores de tipo diferentes<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-6420\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM.png\" alt=\"\" width=\"948\" height=\"416\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM.png 1774w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM-300x132.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM-1024x449.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM-768x337.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM-1536x674.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM-20x9.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM-1320x579.png 1320w\" sizes=\"auto, (max-width: 948px) 100vw, 948px\" \/><\/p>\n<ul>\n<li>O <em>camada_objeto<\/em> A estrutura funciona com consultas de BI agregadas, em que os resultados da consulta podem ser acumulados para cada n\u00edvel.<\/li>\n<li>O <em>n\u00edvel_do_objeto<\/em> fornece o mesmo resultado que a cl\u00e1usula CONNECT BY\/START WITH, que retorna todos os objetos filhos de um determinado n\u00f3. Esse \u00e9 o objeto que usaremos em nossa consulta N1QL para fornecer a solu\u00e7\u00e3o da consulta.<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true\" title=\"Consulta: Pedidos de vendas gerados por membros que se reportam ao vice-presidente de vendas ThomasH SELECT e.EmpID, e.Name, e.ManagerID, sum(o.orderVal) FROM employee e INNER JOIN sales_order o ON o.EmpID = o.EmpId START WITH EmpID = 101 CONNECT BY PRIOR EmpID = ManagerID GROUP BY e.EmpID, e.Name, e.ManagerID;\">N1QL Query: Sales orders generated by members who report up to ThomasH-Sales VP\r\n\r\n\r\nSELECT e.id,sum(a.value)\r\nFROM crm a\r\nINNER JOIN (\r\n      SELECT uhl.id FROM crm uhl WHERE uhl.type ='_employee_hier_level'\r\n     AND uhl.parent='101') e USE HASH(probe) ON a.owner = e.id\r\nWHERE a.type='sales_order'\r\nGROUP BY e.id<\/pre>\n<p>\u00cdndice GS recomendado:<\/p>\n<pre class=\"lang:default decode:true\">CREATE INDEX `crm_employee_hier_level` ON `crm`(`parent`) WHERE (`type` = \"_employee_hier_level\")<\/pre>\n<p>Observa\u00e7\u00f5es:<\/p>\n<ol>\n<li>A consulta principal recupera todos os pedidos de vendas no <code>crm<\/code>\u00a0balde com valor de tipo = 'salesorder'<\/li>\n<li>A consulta executa um HASH JOIN com outra consulta (recurso N1QL 6.5) que recupera todos os IDs de funcion\u00e1rios que se reportam ao user101, ou seja, ThomasH-SalesVP<\/li>\n<li>Os \u00edndices de cobertura adicionais tamb\u00e9m podem melhorar o desempenho da consulta<\/li>\n<li>A consulta usa o N1QL 6.5 ANSI JOIN Support for Expression and Subquery Term<\/li>\n<\/ol>\n<pre class=\"font:consolas font-size:10 lang:python decode:true\" title=\"Trecho de c\u00f3digo Python para achatar uma hierarquia\"># Python code to flatten a JSON document in Couchbase bucket\r\nfrom couchbase.cluster import Cluster\r\nfrom couchbase.cluster import PasswordAuthenticator\r\nfrom couchbase.exceptions import NotFoundError\r\nfrom couchbase.bucket import Bucket\r\nfrom couchbase.n1ql import N1QLQuery\r\n\r\ndef flatten_hierarchy(cb,bucketname,src_doc_type,num_hier_level,node_id_col, parent_id_col):\r\n# Example: flatten_hierarchy(cb,args.bucket,'user',4,'id','managerid')\r\n# cb - couchbase bucket handle\r\n# bucketname - name of the bucket for the source and target documents \r\n# src_doc_type - the type value of the source document\r\n# num_hier_level - specifies the number of levels that are needed. Should be the max depth of the hierarchy\r\n# node_id - the field name in the document for the key node id\r\n# parent_node_id - the parent field \r\n#\r\n    gen_doc_type = '_'+src_doc_type+'_hier'\r\n    if (num_hier_level &gt; 1):\r\n        qstr_ins = 'INSERT into '+bucketname+' (KEY UUID(), VALUE ndoc) '\r\n        qstr_sel = 'SELECT { \"type\":\"'+gen_doc_type+'\"'     \r\n        for i in range(1,num_hier_level+1):\r\n            qstr_sel += ',\"id'+str(i)+'\":l'+str(i)+'.'+node_id_col\r\n        qstr_sel += '} ndoc'     \r\n        qstr_sel_one =  ' SELECT '+node_id_col+','+parent_id_col+' FROM '+bucketname+' WHERE type=\"'+src_doc_type+'\"'\r\n        for i in range(1,num_hier_level+1):\r\n            if (i==1):\r\n                qstr_sel += ' FROM ('+qstr_sel_one+') l'+str(i)\r\n            else:\r\n                qstr_sel += ' LEFT OUTER JOIN ('+qstr_sel_one\r\n                qstr_sel += ') l'+str(i)+' ON l'+str(i-1)+'.'+parent_id_col+' = l'+str(i)+'.'+node_id_col\r\n        try:\r\n            #q = N1QLQuery(qstring)\r\n            rows = cb.n1ql_query(qstr_ins+qstr_sel).execute()\r\n        except Exception as e:\r\n                print(\"query error\",e)\r\n        # generate connect by\r\n\r\n    if (num_hier_level &gt; 1):\r\n        qstr_ins = 'INSERT into '+bucketname+' (KEY UUID(), VALUE ndoc) '\r\n        qstr_sel = 'SELECT { \"id\":ll.child,\"parent\":ll.parent,\"level\":ll.level ,\"type\":\"'+gen_doc_type+'_level\" } ndoc FROM ('\r\n        for i in range(1,num_hier_level):\r\n            if (i&gt;1):\r\n                qstr_sel += 'UNION ALL '\r\n            qstr_sel += 'SELECT id'+str(i+1)+' parent, id1 child,'+str(i)+' level FROM '+bucketname+' WHERE type=\"'+gen_doc_type+'\" and id'+str(i+1)+' IS NOT NULL '\r\n        qstr_sel += ') ll'\r\n        try:\r\n            rows = cb.n1ql_query(qstr_ins+qstr_sel).execute()\r\n        except Exception as e:\r\n            print(\"query error\",e)\r\n    return<\/pre>\n<h4><b>Recursos<\/b><\/h4>\n<ul>\n<li><i>Baixar<\/i>:\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/?family=server&amp;product=couchbase-server-developer\">Fa\u00e7a o download do Couchbase Server 6.5<\/a><i><\/i><\/li>\n<li><i>Documenta\u00e7\u00e3o<\/i>:\u00a0<a href=\"https:\/\/docs.couchbase.com\/server\/6.5\/introduction\/whats-new.html\">Couchbase Server 6.5 O que h\u00e1 de novo<\/a><i><\/i><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/tag\/6-5\/\"><b>Todos os blogs 6.5<\/b><\/a><\/li>\n<\/ul>\n<p>Gostar\u00edamos muito de saber se voc\u00ea gostou dos recursos da vers\u00e3o 6.5 e como ela beneficiar\u00e1 sua empresa no futuro. Compartilhe seu feedback por meio dos coment\u00e1rios ou na se\u00e7\u00e3o\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/\">f\u00f3rum<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>A data construct that often appears in business application is the hierarchical data structure. Hierarchy captures the parent-child relationship often between the same object. For instance a company structure captures the reporting line between employees. Business organization captures the relationship [&hellip;]<\/p>","protected":false},"author":26326,"featured_media":6420,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,1819,1812],"tags":[2378],"ppma_author":[8919],"class_list":["post-6386","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-data-modeling","category-n1ql-query","tag-6-5"],"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>N1QL query with Self Referencing Hierarchy - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/n1ql-query-with-self-referencing-hierarchy\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"N1QL query with Self Referencing Hierarchy\" \/>\n<meta property=\"og:description\" content=\"A data construct that often appears in business application is the hierarchical data structure. Hierarchy captures the parent-child relationship often between the same object. For instance a company structure captures the reporting line between employees. Business organization captures the relationship [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/n1ql-query-with-self-referencing-hierarchy\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-02-18T03:35:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T00:22:10+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1774\" \/>\n\t<meta property=\"og:image:height\" content=\"778\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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=\"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\/n1ql-query-with-self-referencing-hierarchy\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/\"},\"author\":{\"name\":\"Binh Le\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63\"},\"headline\":\"N1QL query with Self Referencing Hierarchy\",\"datePublished\":\"2019-02-18T03:35:55+00:00\",\"dateModified\":\"2025-06-14T00:22:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/\"},\"wordCount\":717,\"commentCount\":5,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM.png\",\"keywords\":[\"6.5\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"Data Modeling\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/\",\"name\":\"N1QL query with Self Referencing Hierarchy - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM.png\",\"datePublished\":\"2019-02-18T03:35:55+00:00\",\"dateModified\":\"2025-06-14T00:22:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM.png\",\"width\":1774,\"height\":778},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"N1QL query with Self Referencing Hierarchy\"}]},{\"@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\/f89064928e262c71eb43bee996c48c63\",\"name\":\"Binh Le\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\/pt\/author\/binh-le-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"N1QL query with Self Referencing Hierarchy - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/n1ql-query-with-self-referencing-hierarchy\/","og_locale":"pt_BR","og_type":"article","og_title":"N1QL query with Self Referencing Hierarchy","og_description":"A data construct that often appears in business application is the hierarchical data structure. Hierarchy captures the parent-child relationship often between the same object. For instance a company structure captures the reporting line between employees. Business organization captures the relationship [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/n1ql-query-with-self-referencing-hierarchy\/","og_site_name":"The Couchbase Blog","article_published_time":"2019-02-18T03:35:55+00:00","article_modified_time":"2025-06-14T00:22:10+00:00","og_image":[{"width":1774,"height":778,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM.png","type":"image\/png"}],"author":"Binh Le","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Binh Le","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/"},"author":{"name":"Binh Le","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63"},"headline":"N1QL query with Self Referencing Hierarchy","datePublished":"2019-02-18T03:35:55+00:00","dateModified":"2025-06-14T00:22:10+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/"},"wordCount":717,"commentCount":5,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM.png","keywords":["6.5"],"articleSection":["Application Design","Best Practices and Tutorials","Data Modeling","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/","url":"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/","name":"N1QL query with Self Referencing Hierarchy - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM.png","datePublished":"2019-02-18T03:35:55+00:00","dateModified":"2025-06-14T00:22:10+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/02\/Screen-Shot-2019-02-20-at-8.59.12-AM.png","width":1774,"height":778},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/n1ql-query-with-self-referencing-hierarchy\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"N1QL query with Self Referencing Hierarchy"}]},{"@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\/f89064928e262c71eb43bee996c48c63","name":"Binh Le","image":{"@type":"ImageObject","inLanguage":"pt-BR","@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 \u00e9 gerente de produto principal do servi\u00e7o Couchbase Query. Antes da Couchbase, ele trabalhou na Oracle e liderou a equipe de gerenciamento de produtos para Sales Cloud Analytics e CRM OnDemand. Binh \u00e9 bacharel em Ci\u00eancia da Computa\u00e7\u00e3o pela Universidade de Brighton, no Reino Unido.","url":"https:\/\/www.couchbase.com\/blog\/pt\/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 \u00e9 gerente de produto principal do servi\u00e7o de consulta do Couchbase. Antes da Couchbase, ele trabalhou na Oracle e liderou a equipe de gerenciamento de produtos para Sales Clould Analytics e CRM OnDemand. Binh \u00e9 bacharel em Ci\u00eancia da Computa\u00e7\u00e3o pela Universidade de Brighton, no Reino Unido."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/6386","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\/26326"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=6386"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/6386\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/6420"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=6386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=6386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=6386"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=6386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}