{"id":7262,"date":"2019-07-26T12:17:59","date_gmt":"2019-07-26T19:17:59","guid":{"rendered":"http:\/\/www.couchbase.com\/blog\/?p=7262"},"modified":"2025-06-13T17:22:00","modified_gmt":"2025-06-14T00:22:00","slug":"analytics-love-the-doc-model-youre-with","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/analytics-love-the-doc-model-youre-with\/","title":{"rendered":"Analytics - Ame o modelo de m\u00e9dico com o qual voc\u00ea est\u00e1"},"content":{"rendered":"<p>Nos aplicativos de neg\u00f3cios, os dados geralmente s\u00e3o modelados para um grande n\u00famero de consultas simult\u00e2neas de baixa lat\u00eancia. Entretanto, se voc\u00ea quiser obter insights observando as tend\u00eancias, acabar\u00e1 desejando ter um modelo de dados totalmente diferente. O meio tradicional de fazer a quadratura desse c\u00edrculo era mover, transformar e carregar os dados em outro lugar, mas isso introduz sua pr\u00f3pria s\u00e9rie de problemas, incluindo lat\u00eancia inaceit\u00e1vel, v\u00e1rias fontes de verdade e muitas despesas.<\/p>\n<p>Os clientes do Couchbase sabem que o servi\u00e7o Analytics oferece uma maneira f\u00e1cil de lidar com relat\u00f3rios anal\u00edticos e de tend\u00eancias em tempo real sobre os dados que eles t\u00eam em produ\u00e7\u00e3o no momento. Um exemplo disso surgiu recentemente, quando trabalhamos com um cliente que buscava identificar a atividade de clientes de alto n\u00edvel associada a um programa de fidelidade de parceiros corporativos. O modelo de documento subjacente foi claramente projetado tendo em mente o aplicativo interativo, e n\u00e3o a gera\u00e7\u00e3o de relat\u00f3rios. (Isso n\u00e3o \u00e9 incomum, como voc\u00ea deve saber por experi\u00eancia pr\u00f3pria.) Vamos dar uma olhada r\u00e1pida no problema e em como o resolvemos.<\/p>\n<h4>Exemplo de documento<\/h4>\n<p>No nosso caso, o modelo de documento (que d\u00e1 suporte a um aplicativo de reservas on-line) \u00e9 composto de quatro se\u00e7\u00f5es. A primeira se\u00e7\u00e3o inclui identificadores b\u00e1sicos de documentos e aplicativos. A segunda descreve as informa\u00e7\u00f5es de reserva sobre uma excurs\u00e3o. A terceira cont\u00e9m detalhes sobre um ou mais itiner\u00e1rios associados \u00e0 reserva, juntamente com os requisitos dos passageiros para um ou mais passageiros. A se\u00e7\u00e3o final descreve os programas de fidelidade corporativos aos quais cada um dos passageiros pode pertencer.<\/p>\n<div id=\"cb1\" class=\"sourceCode\">\n<pre class=\"toolbar:2 toolbar-overlay:false toolbar-hide:false toolbar-delay:false show-title:false show-lang:2 striped:false marking:false ranges:false nums:false nums-toggle:false wrap-toggle:false plain:false show-plain:3 plain-toggle:false copy:false popup:false expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false lang:default decode:true show_mixed:false show_mixed:false\">{\r\n  \"_type\": \"booking\",\r\n  \"_header\": {\r\n    \"created\": 1562888960,\r\n    \"source\": \"app\",\r\n    \"version\": \"v1.1\"\r\n  },\r\n  \"booking\": {\r\n    \"status\": \"BOOKED\",\r\n    \"bookingType\": \"agency\",\r\n    \"details\": {\r\n      \"agent\": \"FBL33\",\r\n      \"contact\": \"Arlene\",\r\n      \"seats\": 2,\r\n      \"excursion\": {\r\n        \"embarking\": 1562958000,\r\n        \"equipment\": \"123X\",\r\n        \"line\": \"SRF\",\r\n        \"fromStation\": {\r\n          \"code\": \"LAX\",\r\n          \"facilityType\": 1\r\n        },\r\n        \"toStation\": {\r\n          \"code\": \"SOL\",\r\n          \"facilityType\": 2\r\n        },\r\n        \"bookingAgency\": \"PC\",\r\n        \"agencyType\": \"3\"\r\n      }\r\n    }\r\n  },\r\n  \"itinerary\": [\r\n    {\r\n      \"daysOnboard\": 1,\r\n      \"passengers\": [\r\n        {\r\n          \"passengerNumber\": 1,\r\n          \"specialAccomodations\": false\r\n        },\r\n        {\r\n          \"passengerNumber\": 2,\r\n          \"specialAccomodations\": false\r\n        }\r\n      ],\r\n      \"itineraryType\": \"business\"\r\n    }\r\n  ],\r\n  \"passengerDetails\": [\r\n    {\r\n      \"loyaltyId\": \"aaaabbbbccccdddd\",\r\n      \"passId\": 1,\r\n      \"programType\": {\r\n        \"corporatePartner\": true,\r\n        \"partnerId\": 1\r\n      }\r\n    },\r\n    {\r\n      \"loyaltyId\": \"eeeeffffgggghhhh\",\r\n      \"passId\": 2,\r\n      \"programType\": {\r\n        \"corporatePartner\": false\r\n      }\r\n    }\r\n  ]\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<h4>Elementos de consulta<\/h4>\n<p>Para concluir a an\u00e1lise, meu cliente precisou extrair ou filtrar os seguintes campos:<\/p>\n<ul>\n<li>status, equipamento, embarque (convertido em formato leg\u00edvel por humanos), linha, _type, daysOnboard, passengerNumber, loyaltyId, partnerId<\/li>\n<\/ul>\n<p>O problema, \u00e9 claro, \u00e9 que esses campos existem em n\u00edveis hier\u00e1rquicos totalmente diferentes dentro do modelo de documento. Alguns s\u00e3o valores escalares, prontamente acess\u00edveis a partir de uma simples consulta:<\/p>\n<ul>\n<li>status, equipamento, embarque, linha, _tipo<\/li>\n<\/ul>\n<p>Outro \u00e9 um elemento dentro de uma matriz (composta de itiner\u00e1rios de viagem), que deve ser aninhado:<\/p>\n<ul>\n<li>dias a bordo<\/li>\n<\/ul>\n<p>Dentro dessa mesma matriz h\u00e1 uma segunda matriz (composta de detalhes do passageiro), cujo elemento deve ser usado como uma chave de jun\u00e7\u00e3o:<\/p>\n<ul>\n<li>passengerNumber<\/li>\n<\/ul>\n<p>Essa chave de jun\u00e7\u00e3o \u00e9 usada para acessar elementos de uma terceira matriz, que, por motivos de aplicativos comerciais, n\u00e3o est\u00e1 aninhada na segunda:<\/p>\n<ul>\n<li>loyaltyId, partnerId<\/li>\n<\/ul>\n<p>Esses diferentes n\u00edveis equivalem a diferentes caminhos de acesso, o que aumenta a complexidade da an\u00e1lise. Felizmente, o N1QL for Analytics fornece as ferramentas sint\u00e1ticas de que precisamos. Veja abaixo uma descri\u00e7\u00e3o passo a passo do processo que voc\u00ea pode usar para criar sua consulta.<\/p>\n<h4>Etapa 1 - sele\u00e7\u00e3o simples de um elemento escalar<\/h4>\n<p>Essa etapa deve ser bastante clara para pessoas com experi\u00eancia em SQL. Usamos uma instru\u00e7\u00e3o select para recuperar um valor escalar do bucket de linhas. Qualificamos o campo de status como parte da se\u00e7\u00e3o de reserva e limitamos o n\u00famero de registros a serem retornados.<\/p>\n<div id=\"cb2\" class=\"sourceCode\">\n<pre class=\"toolbar:2 toolbar-overlay:false toolbar-hide:false toolbar-delay:false show-title:false show-lang:2 striped:false marking:false ranges:false nums:false nums-toggle:false wrap-toggle:false plain:false show-plain:3 plain-toggle:false copy:false popup:false expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:default decode:true\">select booking.status\r\nfrom lines\r\nlimit 1;<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Resultados da consulta:<\/p>\n<div id=\"cb3\" class=\"sourceCode\">\n<pre class=\"toolbar:2 toolbar-overlay:false toolbar-hide:false toolbar-delay:false show-title:false show-lang:2 striped:false marking:false ranges:false nums:false nums-toggle:false wrap-toggle:false plain:false show-plain:3 plain-toggle:false copy:false popup:false expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:default decode:true\">[\r\n  {\r\n    \"status\": \"BOOKED\"\r\n  }\r\n]<\/pre>\n<p>&nbsp;\n<\/p><\/div>\n<h4><\/h4>\n<h4>Etapa 2 - Unnest e adicionar elemento da primeira matriz<\/h4>\n<p>Em seguida, adicionamos dados da se\u00e7\u00e3o de itiner\u00e1rio do documento. No entanto, como esses elementos est\u00e3o incorporados em uma matriz, primeiro precisamos aninh\u00e1-los.<\/p>\n<div id=\"cb4\" class=\"sourceCode\">\n<pre class=\"toolbar:2 toolbar-overlay:false toolbar-hide:false toolbar-delay:false show-title:false show-lang:2 striped:false marking:false ranges:false nums:false nums-toggle:false wrap-toggle:false plain:false show-plain:3 plain-toggle:false copy:false popup:false expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:default decode:true\">select l.booking.status,\r\n       i.daysOnboard\r\nfrom lines l\r\nunnest l.itinerary i\r\nlimit 1;<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Resultados da consulta:<\/p>\n<div id=\"cb5\" class=\"sourceCode\">\n<pre class=\"toolbar:2 toolbar-overlay:false toolbar-hide:false toolbar-delay:false show-title:false show-lang:2 striped:false marking:false ranges:false nums:false nums-toggle:false wrap-toggle:false plain:false show-plain:3 plain-toggle:false copy:false popup:false expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:default decode:true\">[\r\n  {\r\n    \"status\": \"BOOKED\",\r\n    \"daysOnboard\": 1\r\n  }\r\n]<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<h4>Etapa 3 - Unnest e adicionar elemento da segunda matriz (dentro da primeira)<\/h4>\n<p>Agora adicionamos elementos da matriz de passageiros incorporada. (Observe que aumentamos nosso limite para garantir que realmente estamos acessando mais de um elemento da matriz).<\/p>\n<div id=\"cb6\" class=\"sourceCode\">\n<pre class=\"toolbar:2 toolbar-overlay:false toolbar-hide:false toolbar-delay:false show-title:false show-lang:2 striped:false marking:false ranges:false nums:false nums-toggle:false wrap-toggle:false plain:false show-plain:3 plain-toggle:false copy:false popup:false expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:default decode:true\">select l.booking.status,\r\n       i.daysOnboard,\r\n       p.passengerNumber\r\nfrom lines l\r\nunnest l.booking.itinerary i\r\nunnest i.passengers p\r\nlimit 2;<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<p>Resultados da consulta:<\/p>\n<div id=\"cb7\" class=\"sourceCode\">\n<pre class=\"toolbar:2 toolbar-overlay:false toolbar-hide:false toolbar-delay:false show-title:false show-lang:2 striped:false marking:false ranges:false nums:false nums-toggle:false wrap-toggle:false plain:false show-plain:3 plain-toggle:false copy:false popup:false expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:default decode:true\">[\r\n  {\r\n    \"status\": \"BOOKED\",\r\n    \"daysOnboard\": 1,\r\n    \"passengerNumber\": 1\r\n  },\r\n  {\r\n    \"status\": \"BOOKED\",\r\n    \"daysOnboard\": 1,\r\n    \"passengerNumber\": 2\r\n  }\r\n]<\/pre>\n<p>&nbsp;\n<\/p><\/div>\n<h4>Etapa 4 - Unnest e adicionar elemento da terceira matriz, acess\u00edvel por meio de jun\u00e7\u00e3o<\/h4>\n<p>Os elementos do terceiro array (passengerDetails) devem ser aninhados e vinculados aos elementos do array passengers acima. Fazemos isso por meio da cl\u00e1usula where.<\/p>\n<div id=\"cb8\" class=\"sourceCode\">\n<pre class=\"toolbar:2 toolbar-overlay:false toolbar-hide:false toolbar-delay:false show-title:false striped:false marking:false ranges:false nums:false nums-toggle:false wrap-toggle:false plain:false show-plain:3 plain-toggle:false copy:false popup:false expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:default decode:true\">select l.booking.status,\r\n       i.daysOnboard,\r\n       p.passengerNumber,\r\n       pd.loyaltyId\r\nfrom lines l\r\nunnest l.itinerary i\r\nunnest i.passengers p\r\nunnest l.passengerDetails pd\r\nwhere p.passengerNumber = pd.passId\r\nlimit 2;<\/pre>\n<p>&nbsp;\n<\/p><\/div>\n<p>Resultados da consulta:<\/p>\n<div id=\"cb9\" class=\"sourceCode\">\n<pre class=\"toolbar:2 toolbar-overlay:false toolbar-hide:false toolbar-delay:false show-title:false show-lang:2 striped:false marking:false ranges:false nums:false nums-toggle:false wrap-toggle:false plain:false show-plain:3 plain-toggle:false copy:false popup:false expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:default decode:true\">[\r\n  {\r\n    \"status\": \"BOOKED\",\r\n    \"daysOnboard\": 1,\r\n    \"passengerNumber\": 1,\r\n    \"loyaltyId\": \"aaaabbbbccccdddd\"\r\n  },\r\n  {\r\n    \"status\": \"BOOKED\",\r\n    \"daysOnboard\": 1,\r\n    \"passengerNumber\": 2,\r\n    \"loyaltyId\": \"eeeeffffgggghhhh\"\r\n  }\r\n]<\/pre>\n<p>&nbsp;\n<\/p><\/div>\n<h4>Etapa 5 - Adicionar os elementos de consulta restantes<\/h4>\n<p>Outros campos s\u00e3o necess\u00e1rios para completar a consulta. Observe especialmente o campo _type adicionado \u00e0 cl\u00e1usula where. \u00c9 muito prov\u00e1vel que, em um sistema de produ\u00e7\u00e3o, um bucket contenha documentos de v\u00e1rios tipos. Os resultados da consulta podem ser filtrados na pr\u00f3pria consulta (como no exemplo abaixo) ou como parte da cria\u00e7\u00e3o do conjunto de dados do Analytics.<\/p>\n<div id=\"cb10\" class=\"sourceCode\">\n<pre class=\"toolbar:2 toolbar-overlay:false toolbar-hide:false toolbar-delay:false show-title:false show-lang:2 striped:false marking:false ranges:false nums:false nums-toggle:false wrap-toggle:false plain:false show-plain:3 plain-toggle:false copy:false popup:false expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:default decode:true\">select l.booking.status, l.booking.details.excursion.equipment, l.booking.details.excursion.line,\r\n       i.daysOnboard,\r\n       p.passengerNumber,\r\n       pd.loyaltyId, pd.programType.partnerId,\r\n       millis_to_str(l.booking.details.excursion.embarking*1000) embarking\r\nfrom lines l\r\nunnest l.itinerary i\r\nunnest i.passengers p\r\nunnest l.passengerDetails pd\r\nwhere p.passengerNumber = pd.passId\r\n  and l._type = \"booking\"\r\n  and str_to_millis(\"2019-07-12T19:00:00Z\") = l.booking.details.excursion.embarking*1000;<\/pre>\n<p>&nbsp;\n<\/p><\/div>\n<p>Resultados da consulta:<\/p>\n<div id=\"cb11\" class=\"sourceCode\">\n<pre class=\"toolbar:2 toolbar-overlay:false toolbar-hide:false toolbar-delay:false show-title:false striped:false marking:false ranges:false nums:false nums-toggle:false wrap-toggle:false plain:false show-plain:3 plain-toggle:false copy:false popup:false expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:default decode:true\">[\r\n  {\r\n    \"embarking\": \"2019-07-12T19:00:00Z\",\r\n    \"status\": \"BOOKED\",\r\n    \"equipment\": \"123X\",\r\n    \"line\": \"SRF\",\r\n    \"daysOnboard\": 1,\r\n    \"passengerNumber\": 1,\r\n    \"loyaltyId\": \"aaaabbbbccccdddd\",\r\n    \"partnerId\": 1\r\n  },\r\n  {\r\n    \"embarking\": \"2019-07-12T19:00:00Z\",\r\n    \"status\": \"BOOKED\",\r\n    \"equipment\": \"123X\",\r\n    \"line\": \"SRF\",\r\n    \"daysOnboard\": 1,\r\n    \"passengerNumber\": 2,\r\n    \"loyaltyId\": \"eeeeffffgggghhhh\"\r\n  }\r\n]<\/pre>\n<p>&nbsp;\n<\/p><\/div>\n<h4>Leitura adicional<\/h4>\n<p>O Unnest \u00e9 um recurso avan\u00e7ado do N1QL for Analytics, que fornece os meios para dominar v\u00e1rios elementos incorporados em seus dados. Mais informa\u00e7\u00f5es sobre sua sintaxe podem ser encontradas aqui: <a>https:\/\/docs.couchbase.com\/server\/6.0\/analytics\/3_query.html#Unnest_clauses<\/a><\/p>\n<p>Um guia completo do N1QL for Analytics - tenho orgulho de possuir uma c\u00f3pia assinada dele - pode ser encontrado aqui: <a>https:\/\/www.amazon.com\/SQL-Users-Tutorial-Don-Chamberlin\/dp\/0692184503\/<\/a><\/p>\n<h4>Experimente voc\u00ea mesmo<\/h4>\n<p>V\u00e1 direto para <a>https:\/\/docs.couchbase.com\/server\/6.0\/analytics\/quick-start.html#Using_docker<\/a> e comece a usar imediatamente com um tutorial baseado no Docker. Ou, se preferir, fa\u00e7a o download do Couchbase Server 6 Enterprise nesta p\u00e1gina: <a>https:\/\/www.couchbase.com\/downloads<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>In business applications, the data is often modeled for a large number of concurrent low latency queries. If you want to gain insight by looking at trends, however, you end up wishing you had an entirely different data model. The [&hellip;]<\/p>","protected":false},"author":41576,"featured_media":7263,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[2294,1812],"tags":[1875,1861],"ppma_author":[9066],"class_list":["post-7262","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","category-n1ql-query","tag-arrays","tag-unnest"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.7 (Yoast SEO v26.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Analytics - Love the Doc Model You\u2019re With - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"N1QL for Analytics allows for real-time analytics on data without altering the data model. Unnest and join multiple arrays and join with scalar fields.\" \/>\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\/analytics-love-the-doc-model-youre-with\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Analytics - Love the Doc Model You\u2019re With\" \/>\n<meta property=\"og:description\" content=\"N1QL for Analytics allows for real-time analytics on data without altering the data model. Unnest and join multiple arrays and join with scalar fields.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/analytics-love-the-doc-model-youre-with\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-07-26T19:17:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T00:22:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/CouchbasePaddle.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1300\" \/>\n\t<meta property=\"og:image:height\" content=\"661\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Peter Reale\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Peter Reale\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/\"},\"author\":{\"name\":\"Peter Reale\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/391cf559b28ca6b4c1660a1ce283752c\"},\"headline\":\"Analytics &#8211; Love the Doc Model You\u2019re With\",\"datePublished\":\"2019-07-26T19:17:59+00:00\",\"dateModified\":\"2025-06-14T00:22:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/\"},\"wordCount\":794,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/CouchbasePaddle.jpg\",\"keywords\":[\"arrays\",\"unnest\"],\"articleSection\":[\"Couchbase Analytics\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/\",\"name\":\"Analytics - Love the Doc Model You\u2019re With - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/CouchbasePaddle.jpg\",\"datePublished\":\"2019-07-26T19:17:59+00:00\",\"dateModified\":\"2025-06-14T00:22:00+00:00\",\"description\":\"N1QL for Analytics allows for real-time analytics on data without altering the data model. Unnest and join multiple arrays and join with scalar fields.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/CouchbasePaddle.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/CouchbasePaddle.jpg\",\"width\":1300,\"height\":661},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Analytics &#8211; Love the Doc Model You\u2019re With\"}]},{\"@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\/391cf559b28ca6b4c1660a1ce283752c\",\"name\":\"Peter Reale\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ec988e11a3058e02331c83244e993ea2\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/19012c1e7433fcde0d634a14a0f76610c40ce876b6c5a04b23d43c2181301761?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/19012c1e7433fcde0d634a14a0f76610c40ce876b6c5a04b23d43c2181301761?s=96&d=mm&r=g\",\"caption\":\"Peter Reale\"},\"description\":\"Peter Reale is a Senior Solutions Engineer at Couchbase and has been in the data business since 1984. He is based in Los Angeles.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/peter-reale\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Analytics - Love the Doc Model You\u2019re With - The Couchbase Blog","description":"O N1QL for Analytics permite a an\u00e1lise de dados em tempo real sem alterar o modelo de dados. Unnest e jun\u00e7\u00e3o de v\u00e1rias matrizes e jun\u00e7\u00e3o com campos escalares.","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\/analytics-love-the-doc-model-youre-with\/","og_locale":"pt_BR","og_type":"article","og_title":"Analytics - Love the Doc Model You\u2019re With","og_description":"N1QL for Analytics allows for real-time analytics on data without altering the data model. Unnest and join multiple arrays and join with scalar fields.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/analytics-love-the-doc-model-youre-with\/","og_site_name":"The Couchbase Blog","article_published_time":"2019-07-26T19:17:59+00:00","article_modified_time":"2025-06-14T00:22:00+00:00","og_image":[{"width":1300,"height":661,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/CouchbasePaddle.jpg","type":"image\/jpeg"}],"author":"Peter Reale","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Peter Reale","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/"},"author":{"name":"Peter Reale","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/391cf559b28ca6b4c1660a1ce283752c"},"headline":"Analytics &#8211; Love the Doc Model You\u2019re With","datePublished":"2019-07-26T19:17:59+00:00","dateModified":"2025-06-14T00:22:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/"},"wordCount":794,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/CouchbasePaddle.jpg","keywords":["arrays","unnest"],"articleSection":["Couchbase Analytics","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/","url":"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/","name":"Analytics - Love the Doc Model You\u2019re With - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/CouchbasePaddle.jpg","datePublished":"2019-07-26T19:17:59+00:00","dateModified":"2025-06-14T00:22:00+00:00","description":"O N1QL for Analytics permite a an\u00e1lise de dados em tempo real sem alterar o modelo de dados. Unnest e jun\u00e7\u00e3o de v\u00e1rias matrizes e jun\u00e7\u00e3o com campos escalares.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/CouchbasePaddle.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2019\/07\/CouchbasePaddle.jpg","width":1300,"height":661},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/analytics-love-the-doc-model-youre-with\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Analytics &#8211; Love the Doc Model You\u2019re With"}]},{"@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\/391cf559b28ca6b4c1660a1ce283752c","name":"Peter Reale","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ec988e11a3058e02331c83244e993ea2","url":"https:\/\/secure.gravatar.com\/avatar\/19012c1e7433fcde0d634a14a0f76610c40ce876b6c5a04b23d43c2181301761?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/19012c1e7433fcde0d634a14a0f76610c40ce876b6c5a04b23d43c2181301761?s=96&d=mm&r=g","caption":"Peter Reale"},"description":"Peter Reale is a Senior Solutions Engineer at Couchbase and has been in the data business since 1984. He is based in Los Angeles.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/peter-reale\/"}]}},"authors":[{"term_id":9066,"user_id":41576,"is_guest":0,"slug":"peter-reale","display_name":"Peter Reale","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/19012c1e7433fcde0d634a14a0f76610c40ce876b6c5a04b23d43c2181301761?s=96&d=mm&r=g","author_category":"","last_name":"Reale, Senior Solutions Engineer, Couchbase","first_name":"Peter","job_title":"","user_url":"","description":"Peter Reale \u00e9 engenheiro de solu\u00e7\u00f5es s\u00eanior da Couchbase e atua no setor de dados desde 1984.  Ele mora em Los Angeles."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/7262","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\/41576"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=7262"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/7262\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/7263"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=7262"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=7262"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=7262"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=7262"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}