{"id":2841,"date":"2017-02-27T07:19:19","date_gmt":"2017-02-27T15:19:19","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2841"},"modified":"2020-02-16T18:00:29","modified_gmt":"2020-02-17T02:00:29","slug":"joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/","title":{"rendered":"Unindo dados NoSQL: Linguagem de Consulta do MongoDB vs Couchbase N1QL"},"content":{"rendered":"<p>Uma das perguntas mais frequentes que recebo quando se trata de NoSQL \u00e9 sobre o assunto de unir dados de v\u00e1rios documentos em um \u00fanico resultado de consulta. Embora essa pergunta seja feita com mais frequ\u00eancia por desenvolvedores de RDBMS, tamb\u00e9m a recebo de desenvolvedores de NoSQL.<\/p>\n<p>Quando se trata de uni\u00e3o de dados, cada banco de dados faz isso de forma diferente, sendo que alguns deles exigem que isso seja feito por meio da camada do aplicativo, e n\u00e3o da camada do banco de dados. Vamos explorar algumas op\u00e7\u00f5es de uni\u00e3o de dados entre tecnologias de banco de dados.<\/p>\n<p><!--more--><\/p>\n<p>Neste blog, compararemos o processo de uni\u00e3o de documentos NoSQL usando o operador $lookup do MongoDB com o processo de uni\u00e3o de documentos NoSQL usando o operador $lookup do MongoDB. <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/\" target=\"_blank\" rel=\"noopener noreferrer\">Couchbase<\/a>mais intuitiva do N1QL.<\/p>\n<h2>Os dados da amostra<\/h2>\n<p>Para este exemplo, basearemos o MongoDB e o Couchbase em dois documentos de amostra. Suponhamos que estejamos trabalhando com um exemplo cl\u00e1ssico de pedido e estoque. No caso do invent\u00e1rio, nossos documentos podem ser mais ou menos assim:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\" title=\"Documentos do produto\">{\r\n    \"id\": \"product-1\",\r\n    \"type\": \"product\",\r\n    \"name\": \"Pokemon Red\",\r\n    \"price\": 29.99\r\n}<\/pre>\n<p>Embora plano, o documento acima pode explicar adequadamente um produto espec\u00edfico. Ele tem um ID exclusivo que ser\u00e1 envolvido durante o processo de uni\u00e3o. Para pedidos, podemos ter um documento parecido com o seguinte:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\" title=\"Documentos de pedido\">{\r\n    \"id\": \"order-1\",\r\n    \"type\": \"order\",\r\n    \"products\": [\r\n        {\r\n            \"product_id\": \"product-1\",\r\n            \"quantity\": 2\r\n        }\r\n    ]\r\n}<\/pre>\n<p>O objetivo aqui ser\u00e1 unir esses dois documentos em uma \u00fanica consulta usando o MongoDB e o Couchbase. No entanto, deixando de lado a linguagem de consulta, esses documentos sempre podem ser unidos por meio da camada de aplicativo por meio de v\u00e1rias consultas. No entanto, esse n\u00e3o \u00e9 o resultado que estamos buscando.<\/p>\n<h3>Unindo documentos com o MongoDB e o operador $lookup<\/h3>\n<p>Nas vers\u00f5es recentes do MongoDB, as consultas de uni\u00e3o envolvem um <code>$lookup<\/code> que faz parte das consultas de agrega\u00e7\u00e3o. De acordo com o MongoDB <a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/operator\/aggregation\/lookup\/\" target=\"_blank\" rel=\"noopener noreferrer\">documenta\u00e7\u00e3o<\/a>Esse operador funciona da seguinte forma:<\/p>\n<blockquote><p>Executa uma uni\u00e3o externa esquerda com uma cole\u00e7\u00e3o n\u00e3o fragmentada no mesmo banco de dados para filtrar os documentos da cole\u00e7\u00e3o \"unida\" para processamento. O est\u00e1gio $lookup faz uma correspond\u00eancia de igualdade entre um campo dos documentos de entrada e um campo dos documentos da cole\u00e7\u00e3o \"unida\".<\/p><\/blockquote>\n<p>Para usar o <code>$lookup<\/code> operador, voc\u00ea teria algo parecido com isto:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\" title=\"Consulta agregada do MongoDB\">db.collection.aggregate([\r\n    {\r\n       $lookup:\r\n         {\r\n           from: &lt;collection to join&gt;,\r\n           localField: &lt;field from the input documents&gt;,\r\n           foreignField: &lt;field from the documents of the \"from\" collection&gt;,\r\n           as: &lt;output array field&gt;\r\n         }\r\n    }\r\n])<\/pre>\n<p>Isso \u00e9 \u00f3timo, mas n\u00e3o funciona em relacionamentos encontrados em matrizes. Isso significa que o <code>$lookup<\/code> n\u00e3o pode participar da opera\u00e7\u00e3o <code>product_id<\/code> encontrado no <code>produtos<\/code> para outro documento. Em vez disso, a matriz deve ser \"desenrolada\" ou \"aninhada\" primeiro, o que acrescenta uma complexidade extra \u00e0 nossa consulta:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\" title=\"MongoDB Unwind Then Lookup\">db.orders.aggregate([\r\n    { $unwind: \"$products\" },\r\n    {\r\n        $lookup: {\r\n            from: \"products\",\r\n            localField: \"products.product_id\",\r\n            foreignField: \"_id\",\r\n            as: \"productObjects\"\r\n        }\r\n    }\r\n])<\/pre>\n<p>O <code>$unwind<\/code> achatar\u00e1 a matriz e, em seguida, far\u00e1 uma jun\u00e7\u00e3o dos objetos agora achatados que foram produzidos. O resultado dessa consulta teria a seguinte apar\u00eancia:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">{\r\n    \"_id\" : ObjectId(\"58a3869acbf64c4ace55e713\"),\r\n    \"products\" : {\r\n        \"product_id\" : ObjectId(\"58a3851b2f14a900caa7a731\"),\r\n        \"quantity\" : 2\r\n    },\r\n    \"productObjects\" : [\r\n        {\r\n            \"_id\" : ObjectId(\"58a3851b2f14a900caa7a731\"),\r\n            \"name\" : \"Pokemon Red\",\r\n            \"price\" : 29.99\r\n        }\r\n    ]\r\n}<\/pre>\n<p>Se houvesse mais de uma refer\u00eancia na matriz, haveria mais resultados retornados. No entanto, o que \u00e9 retornado n\u00e3o \u00e9 muito atraente. Ainda temos o antigo <code>produtos<\/code> e agora um objeto <code>productsObject<\/code> matriz. \u00c9 necess\u00e1rio realizar outras manipula\u00e7\u00f5es no fluxo de dados.<\/p>\n<p>O <code>productsObject<\/code> A matriz deve ser \"desenrolada\" e depois reconstru\u00edda de acordo com o que desejamos. Isso pode ser feito da seguinte forma:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">db.orders.aggregate([\r\n    { $unwind: \"$products\" },\r\n    {\r\n        $lookup: {\r\n            from: \"products\",\r\n            localField: \"products.product_id\",\r\n            foreignField: \"_id\",\r\n            as: \"productObjects\"\r\n        }\r\n    },\r\n    { $unwind: \"$productObjects\"},\r\n    {\r\n        $project: {\r\n            products: {\r\n                \"quantity\": \"$products.quantity\",\r\n                \"name\": \"$productObjects.name\",\r\n                \"price\": \"$productObjects.price\"\r\n            }\r\n        }\r\n    }\r\n])<\/pre>\n<p>Observe que o <code>agregado<\/code> A consulta agora est\u00e1 ficando mais complexa. Depois de fazer a uni\u00e3o, o resultado \u00e9 \"desenrolado\" e, em seguida, o resultado \u00e9 reconstru\u00eddo usando a fun\u00e7\u00e3o <code>Projeto $<\/code> operador.<\/p>\n<p>Nesse ponto, outras manipula\u00e7\u00f5es do resultado podem ser feitas, como agrupar os resultados de modo que o <code>produtos<\/code> tornam-se novamente um \u00fanico array. Cada manipula\u00e7\u00e3o do conjunto de dados requer mais c\u00f3digo de agrega\u00e7\u00e3o, que pode facilmente se tornar confuso, complicado e dif\u00edcil de ler.<\/p>\n<p>\u00c9 nesse ponto que o Couchbase N1QL se torna muito mais agrad\u00e1vel de se trabalhar.<\/p>\n<h3>Usando o Couchbase e o N1QL para unir documentos NoSQL<\/h3>\n<p>Vamos usar o mesmo exemplo de documento que usamos para o MongoDB. Desta vez, vamos escrever consultas SQL com o N1QL para realizar o trabalho.<\/p>\n<p>A primeira coisa que vem \u00e0 mente pode ser usar um <code>JUNTAR<\/code> em SQL. Nossa consulta pode ser semelhante a esta:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">SELECT orders.*, product\r\nFROM example AS orders\r\nJOIN example AS product ON KEYS orders.products[*].product_id\r\nWHERE orders.type = 'order'<\/pre>\n<p>No exemplo acima, ambos os documentos existem no mesmo Bucket do Couchbase. A <code>JUNTAR<\/code> em rela\u00e7\u00e3o aos ids de documentos ocorre com base no <code>product_id<\/code> valores encontrados no <code>produtos<\/code> array. A consulta acima produziria resultados parecidos com os seguintes:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">[\r\n  {\r\n    \"id\": \"order-1\",\r\n    \"product\": {\r\n      \"id\": \"product-1\",\r\n      \"name\": \"Pokemon Red\",\r\n      \"price\": 29.99,\r\n      \"type\": \"product\"\r\n    },\r\n    \"products\": [\r\n      {\r\n        \"product_id\": \"product-1\",\r\n        \"quantity\": 2\r\n      }\r\n    ],\r\n    \"type\": \"order\"\r\n  }\r\n]<\/pre>\n<p>Assim como no MongoDB, haver\u00e1 um resultado para cada item da tabela <code>produtos<\/code> que corresponde. Para ser justo, embora a vers\u00e3o N1QL fosse mais f\u00e1cil de escrever, ela n\u00e3o era necessariamente mais dif\u00edcil do que a linguagem de consulta do MongoDB nesse ponto. \u00c0 medida que manipulamos mais os dados, o Couchbase se torna muito mais f\u00e1cil em compara\u00e7\u00e3o.<\/p>\n<p>Por exemplo, digamos que queremos limpar os resultados:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">SELECT orders.id, orders.type, OBJECT_PUT(product, \"quantity\", products.quantity) AS product\r\nFROM example AS orders\r\nUNNEST orders.products AS products\r\nJOIN example AS product ON KEYS products.product_id\r\nWHERE orders.type = 'order'<\/pre>\n<p>H\u00e1 algumas diferen\u00e7as importantes no que estamos fazendo no exemplo acima, mas pequenas diferen\u00e7as na forma como estamos fazendo. Em vez de unir diretamente a matriz, estamos primeiro achatando ou \"aninhando\" a matriz, como vimos no MongoDB <code>$unwind<\/code> operador. A uni\u00e3o agora est\u00e1 acontecendo em cada um dos resultados achatados. Por fim, o operador <code>quantidade<\/code> do objeto original \u00e9 adicionado ao novo objeto.<\/p>\n<p>O resultado da consulta acima seria algo parecido com isto:<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">[\r\n  {\r\n    \"id\": \"order-1\",\r\n    \"product\": {\r\n      \"id\": \"product-1\",\r\n      \"name\": \"Pokemon Red\",\r\n      \"price\": 29.99,\r\n      \"quantity\": 2,\r\n      \"type\": \"product\"\r\n    },\r\n    \"type\": \"order\"\r\n  }\r\n]<\/pre>\n<p>Digamos que o original <code>produtos<\/code> tinha mais de uma refer\u00eancia de produto. Em vez de retornar v\u00e1rios objetos com base no <code>JUNTAR<\/code> Como vimos acima, pode fazer sentido reempacotar a matriz original.<\/p>\n<pre class=\"lang:default highlight:0 decode:true\">SELECT orders.id, orders.type, ARRAY_AGG(OBJECT_PUT(product, \"quantity\", products.quantity)) AS products\r\nFROM example AS orders\r\nUNNEST orders.products AS products\r\nJOIN example AS product ON KEYS products.product_id\r\nWHERE orders.type = 'order'\r\nGROUP BY orders<\/pre>\n<p>Na consulta acima, adicionamos apenas <code>ARRAY_AGG<\/code> e um <code>GRUPO POR<\/code>mas, como resultado, cada documento unido aparece no <code>produtos<\/code> em vez do valor de id.<\/p>\n<p>N\u00e3o quero usar um <code>JUNTAR<\/code> operador? Em vez disso, tente usar uma subconsulta SQL.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>No NoSQL, a uni\u00e3o de dados \u00e9 uma preocupa\u00e7\u00e3o muito popular entre os desenvolvedores que s\u00e3o veteranos experientes em RDBMS. Como o MongoDB \u00e9 uma tecnologia NoSQL muito popular, achei que seria bom us\u00e1-lo para comparar como o Couchbase lida com a uni\u00e3o de documentos. Para opera\u00e7\u00f5es leves, <code>$lookup<\/code> \u00e9 toler\u00e1vel, mas \u00e0 medida que as consultas de uni\u00e3o no MongoDB se tornam mais complexas, talvez seja necess\u00e1rio dar um passo atr\u00e1s. Com o N1QL, escrever consultas complexas que incluem opera\u00e7\u00f5es de uni\u00e3o se torna muito f\u00e1cil e continua sendo f\u00e1cil, independentemente da complexidade da consulta.<\/p>\n<p>Para obter mais informa\u00e7\u00f5es sobre o N1QL e o Couchbase, visite o site <a href=\"https:\/\/developer.couchbase.com\" target=\"_blank\" rel=\"noopener noreferrer\">Portal do desenvolvedor do Couchbase<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>One of the most frequent questions I receive when it comes to NoSQL is on the subject of joining data from multiple documents into a single query result. While this question is brought up more frequently from RDBMS developers, I [&hellip;]<\/p>","protected":false},"author":63,"featured_media":2787,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1816,1812],"tags":[1309,1861],"ppma_author":[9032],"class_list":["post-2841","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-server","category-n1ql-query","tag-mongodb","tag-unnest"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL<\/title>\n<meta name=\"description\" content=\"Learn the secrets of joining NoSQL documents in this tutorial featuring the MongoDB Query Language and Couchbase&#039;s intuitive N1QL query language.\" \/>\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\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL\" \/>\n<meta property=\"og:description\" content=\"Learn the secrets of joining NoSQL documents in this tutorial featuring the MongoDB Query Language and Couchbase&#039;s intuitive N1QL query language.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2017-02-27T15:19:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-02-17T02:00:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/mongo-to-couchbase.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1100\" \/>\n\t<meta property=\"og:image:height\" content=\"389\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL\",\"datePublished\":\"2017-02-27T15:19:19+00:00\",\"dateModified\":\"2020-02-17T02:00:29+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/\"},\"wordCount\":975,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png\",\"keywords\":[\"mongodb\",\"unnest\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Server\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/\",\"name\":\"Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png\",\"datePublished\":\"2017-02-27T15:19:19+00:00\",\"dateModified\":\"2020-02-17T02:00:29+00:00\",\"description\":\"Learn the secrets of joining NoSQL documents in this tutorial featuring the MongoDB Query Language and Couchbase's intuitive N1QL query language.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png\",\"width\":1100,\"height\":389},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL\"}]},{\"@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\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Unindo dados NoSQL: Linguagem de Consulta do MongoDB vs Couchbase N1QL","description":"Learn the secrets of joining NoSQL documents in this tutorial featuring the MongoDB Query Language and Couchbase's intuitive N1QL query language.","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\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/","og_locale":"pt_BR","og_type":"article","og_title":"Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL","og_description":"Learn the secrets of joining NoSQL documents in this tutorial featuring the MongoDB Query Language and Couchbase's intuitive N1QL query language.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2017-02-27T15:19:19+00:00","article_modified_time":"2020-02-17T02:00:29+00:00","og_image":[{"width":1100,"height":389,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/mongo-to-couchbase.png","type":"image\/png"}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL","datePublished":"2017-02-27T15:19:19+00:00","dateModified":"2020-02-17T02:00:29+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/"},"wordCount":975,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png","keywords":["mongodb","unnest"],"articleSection":["Best Practices and Tutorials","Couchbase Server","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/","url":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/","name":"Unindo dados NoSQL: Linguagem de Consulta do MongoDB vs Couchbase N1QL","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png","datePublished":"2017-02-27T15:19:19+00:00","dateModified":"2020-02-17T02:00:29+00:00","description":"Learn the secrets of joining NoSQL documents in this tutorial featuring the MongoDB Query Language and Couchbase's intuitive N1QL query language.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/mongo-to-couchbase.png","width":1100,"height":389},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/joining-nosql-documents-mongodb-query-language-vs-couchbase-n1ql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Joining NoSQL Data: MongoDB Query Language vs Couchbase N1QL"}]},{"@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\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, defensor dos desenvolvedores, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy \u00e9 um defensor das modernas tecnologias de desenvolvimento m\u00f3vel e da Web. Ele tem experi\u00eancia em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experi\u00eancias de desenvolvimento relacionadas a tornar o desenvolvimento m\u00f3vel e da Web mais f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","author_category":"","last_name":"Raboy","first_name":"Nic","job_title":"","user_url":"https:\/\/www.thepolyglotdeveloper.com","description":"Nic Raboy \u00e9 um defensor das modernas tecnologias de desenvolvimento m\u00f3vel e da Web. Ele tem experi\u00eancia em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experi\u00eancias de desenvolvimento relacionadas a tornar o desenvolvimento m\u00f3vel e da Web mais f\u00e1cil de entender."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2841","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\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2841"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2841\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/2787"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2841"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}