{"id":5470,"date":"2018-07-11T23:07:33","date_gmt":"2018-07-12T06:07:33","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5470"},"modified":"2025-06-13T20:20:03","modified_gmt":"2025-06-14T03:20:03","slug":"joining-json-comparing-couchbase-n1ql-mongodb","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/joining-json-comparing-couchbase-n1ql-mongodb\/","title":{"rendered":"Como unir JSON: consulta N1QL do Couchbase vs. consulta do MongoDB"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5483\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/07\/Screen-Shot-2018-07-13-at-1.24.12-PM-300x157.png\" alt=\"\" width=\"567\" height=\"297\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/Screen-Shot-2018-07-13-at-1.24.12-PM-300x157.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/Screen-Shot-2018-07-13-at-1.24.12-PM-20x10.png 20w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/Screen-Shot-2018-07-13-at-1.24.12-PM.png 655w\" sizes=\"auto, (max-width: 567px) 100vw, 567px\" \/><\/p>\n<p><span style=\"font-weight: 400;\">\u00c0 medida que os bancos de dados NoSQL evolu\u00edram, cada um deles adicionou APIs ou linguagens de n\u00edvel superior para ajudar os programadores a fazer coisas complexas com facilidade. O SQL, tendo feito isso com os dados relacionais, mostrou o caminho. No SQL, os desenvolvedores dizem O QUE precisa ser feito e o mecanismo do banco de dados descobre COMO.  HOW \u00e9 o procedimento\/algoritmo eficiente para executar a instru\u00e7\u00e3o. <\/span><span style=\"font-weight: 400;\">Selecionar, unir e projetar s\u00e3o as opera\u00e7\u00f5es b\u00e1sicas de processamento do SQL. Mesmo em sistemas NoSQL, quando voc\u00ea modela os dados sem muita normaliza\u00e7\u00e3o, ainda \u00e9 necess\u00e1rio unir uma cole\u00e7\u00e3o de objetos.  Clientes com pedidos, pedidos com estoque, estoque com fornecedores, fornecedores com cr\u00e9ditos e assim por diante. Por isso, o Couchbase N1QL oferece suporte a opera\u00e7\u00f5es de uni\u00e3o desde sua primeira vers\u00e3o.  Depois disso, o MongoDB, na vers\u00e3o 3.2, adicionou o operador $lookup \u00e0 estrutura de agrega\u00e7\u00e3o para executar as opera\u00e7\u00f5es de uni\u00e3o. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Sem um recurso de consulta expressivo e de alto desempenho, os desenvolvedores de aplicativos precisam fazer isso dentro do aplicativo ou exportar os dados para um sistema que fa\u00e7a isso.  Ambas as propostas s\u00e3o caras. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Neste artigo, compararemos o Couchbase com o MongoDB e suas diferentes abordagens para unir documentos JSON. Especificamente, faremos um estudo comparativo entre o uso de uni\u00f5es para cole\u00e7\u00f5es do MongoDB e como podemos execut\u00e1-las no Couchbase. <span style=\"color: #0000ff;\">As uni\u00f5es n\u00e3o s\u00e3o compat\u00edveis com o Cassandra CQL e o DynamoDB nativamente.  Os desenvolvedores precisam fazer o trabalho por conta pr\u00f3pria ou usar outras camadas, como Spark ou Amazon EMR, para obter o mesmo resultado. Portanto, n\u00e3o abordaremos esse assunto neste artigo<\/span>.<\/span><\/p>\n<p><span style=\"color: #ff0000;\">Uni\u00f5es no Couchbase<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O Couchbase introduziu as uni\u00f5es INNER e LEFT OUTER a partir do Couchbase 4.0 (2015). Isso oferece suporte a uni\u00f5es em um relacionamento filho para pai.  Documentos filhos (por exemplo, pedidos) podem ser unidos a documentos pais (por exemplo, cliente). Na vers\u00e3o 4.5 (2016), o Couchbase introduziu <\/span><a href=\"https:\/\/dzone.com\/articles\/join-faster-with-couchbase-index-joins\"><span style=\"font-weight: 400;\">uni\u00f5es de \u00edndices<\/span><\/a><span style=\"font-weight: 400;\"> para consultar as uni\u00f5es de pai para filho.  Em ambos os casos, havia um valor de atributo impl\u00edcito para o predicado de igualdade de chave de documento, especificado pela cl\u00e1usula ON KEY. \u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O Couchbase 5.5 tem SQL padr\u00e3o ANSI estendido para JSON.  Ele suporta INNER JOIN, LEFT OUTER JOIN e RIGHT OUTER join limitado.  Usaremos exemplos baseados no Couchbase 5.5.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A documenta\u00e7\u00e3o do Couchbase se une: <\/span><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/n1ql\/n1ql-language-reference\/from.html\"><span style=\"font-weight: 400;\">https:\/\/developer.couchbase.com\/documentation\/server\/5.5\/n1ql\/n1ql-language-reference\/from.html<\/span><\/a><\/p>\n<p><span style=\"color: #008000;\">Uni\u00f5es e cole\u00e7\u00f5es do MongoDB:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">As uni\u00f5es s\u00e3o compat\u00edveis com o operador $lookup dentro da estrutura de agrega\u00e7\u00e3o. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Veja a seguir trechos da documenta\u00e7\u00e3o do MongoDB.<\/span><\/p>\n<p><i><span style=\"font-weight: 400;\">Novo na vers\u00e3o 3.2.<\/span><\/i><\/p>\n<p><span style=\"font-weight: 400;\">Executa uma jun\u00e7\u00e3o externa esquerda com uma cole\u00e7\u00e3o n\u00e3o fragmentada no <\/span><i><span style=\"font-weight: 400;\">mesmo<\/span><\/i><span style=\"font-weight: 400;\"> para filtrar os documentos da cole\u00e7\u00e3o \"unida\" para processamento. Para cada documento de entrada, o <\/span><a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/operator\/aggregation\/lookup\/#pipe._S_lookup\"><span style=\"font-weight: 400;\">$lookup<\/span><\/a><span style=\"font-weight: 400;\"> adiciona um novo campo de matriz cujos elementos s\u00e3o os documentos correspondentes da cole\u00e7\u00e3o \"joined\". A etapa <\/span><a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/operator\/aggregation\/lookup\/#pipe._S_lookup\"><span style=\"font-weight: 400;\">$lookup<\/span><\/a><span style=\"font-weight: 400;\"> passa esses documentos reformulados para o pr\u00f3ximo est\u00e1gio.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Eliot Horowitz, CTO do MongoDB, <\/span><a href=\"https:\/\/www.youtube.com\/watch?v=MPPwn1XmhzQ\"><span style=\"font-weight: 400;\">disse<\/span><\/a><span style=\"font-weight: 400;\">: \"A agrega\u00e7\u00e3o do MongoDB \u00e9 semelhante ao pipeline do Unix. A sa\u00edda de um est\u00e1gio vai para outro.... [\u00e9] muito processual. Permite que voc\u00ea pense de uma forma muito processual.\"<\/span><\/p>\n<p><span style=\"font-weight: 400;\">MongoDB $lookup : <\/span><a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/operator\/aggregation\/lookup\/\"><span style=\"font-weight: 400;\">https:\/\/docs.mongodb.com\/manual\/reference\/operator\/aggregation\/lookup\/<\/span><\/a><\/p>\n<hr \/>\n<p style=\"text-align: center;\"><strong>Interessado em saber mais sobre JOINs?  Leia o artigo de Lukas Eder. <a href=\"https:\/\/dzone.com\/articles\/a-probably-incomplete-comprehensive-guide-to-the-many-different-ways-to-join-tables-in-sql\">https:\/\/dzone.com\/articles\/a-probably-incomplete-comprehensive-guide-to-the-many-different-ways-to-join-tables-in-sql<\/a><\/strong><\/p>\n<hr \/>\n<p><span style=\"font-weight: 400; color: #0000ff;\">Compara\u00e7\u00e3o de alto n\u00edvel entre o Couchbase N1Ql e o MongoDB.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Couchbase N1QL: Oferece suporte a INNER JOIN, LEFT OUTER JOIN e RIGHT OUTER JOIN limitado.  A linguagem de consulta, como o SQL, \u00e9 declarativa. Os desenvolvedores escrevem e as ferramentas geram a consulta de acordo com a sintaxe N1QL.  O mecanismo descobre o plano e executa a consulta.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">MongoDB: oferece suporte a LEFT OUTER JOIN somente para valores escalares.  O design das jun\u00e7\u00f5es na linguagem de consulta do MongoDB \u00e9 feito para ajudar a escrever a consulta e processar os dados de forma processual.\u00a0<\/span><\/p>\n<p><span style=\"color: #0000ff;\">Implica\u00e7\u00f5es<\/span><span style=\"font-weight: 400;\"><span style=\"color: #0000ff;\">:<\/span> <\/span><\/p>\n<ol>\n<li><span style=\"font-weight: 400;\">O conjunto de resultados da uni\u00e3o externa esquerda \u00e9 um superconjunto do conjunto de resultados da uni\u00e3o interna.  \u00c9 poss\u00edvel acrescentar predicados adicionais para eliminar os documentos n\u00e3o correspondentes (com proje\u00e7\u00e3o nula ou lado subserviente ausente da uni\u00e3o) depois que a uni\u00e3o externa esquerda for executada.  Isso \u00e9 como ir de S\u00e3o Francisco a Chicago via Londres. Voc\u00ea pode fazer isso, mas \u00e9 caro. Para a execu\u00e7\u00e3o da consulta, s\u00e3o necess\u00e1rios tempo, mem\u00f3ria e recursos de CPU que afetam o desempenho geral do sistema.<\/span><\/li>\n<li>O suporte do N1QL para jun\u00e7\u00f5es \u00e9 declarativo.  A linguagem do MongoDB \u00e9 um tanto processual.  Voc\u00ea precisa separar os predicados, pensar na ordem de jun\u00e7\u00e3o entre as cole\u00e7\u00f5es, pensar em quando agrupar, classificar, etc.  Escrever consultas com agrega\u00e7\u00e3o do MongoDB \u00e9 como escrever planos de consulta, passo a passo.<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400; color: #0000ff;\"><strong>Exemplos:<\/strong> <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Usamos o modelo e os dados simples de amostra de viagem.  Aqui est\u00e3o os detalhes dos dados do modelo. <\/span><a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.5\/travel-app\/travel-app-data-model.html\"><span style=\"font-weight: 400;\">https:\/\/developer.couchbase.com\/documentation\/server\/4.5\/travel-app\/travel-app-data-model.html<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Simplesmente exportamos os dados do Couchbase e os importamos para um banco de dados Mongo chamado travel-sample.  No MongoDB, os 5 tipos diferentes de documento (ponto de refer\u00eancia, rota, companhia a\u00e9rea, aeroporto, hotel) s\u00e3o armazenados em 5 cole\u00e7\u00f5es com seus respectivos nomes.<\/span><\/p>\n<p><span style=\"color: #0000ff;\"><span style=\"font-weight: 400;\">Exemplo 1<\/span><span style=\"font-weight: 400;\">: LEFT OUTER JOIN com a cl\u00e1usula ON em valores escalares.<\/span><\/span><\/p>\n<p><span style=\"color: #ff0000;\">Couchbase N1QL<\/span><\/p>\n<pre class=\"theme:github font:courier-new wrap:true whitespace-before:1 whitespace-after:1 lang:mysql decode:true\" title=\"Consulta no Couchbase N1QL\">SELECT count(*)\r\nFROM `travel-sample` route\r\n         LEFT OUTER JOIN `travel-sample` airline\r\n         ON (route.airlineid = META(airline).id)\r\nWHERE route.type = 'route';\r\n<\/pre>\n<p><span style=\"color: #008000;\">Consulta ao MongoDB<\/span><\/p>\n<pre class=\"theme:github font:courier-new wrap:true whitespace-before:1 whitespace-after:1 lang:js decode:true\" title=\"Consulta convertida no MongoDB\">db.route.aggregate([\r\n   {\r\n     $lookup:\r\n       {\r\n         from:\"airline\",\r\n         localField: \"airlineid\",\r\n         foreignField: \"_id\",\r\n         as: \"airline_docs\"\r\n       }\r\n   },\r\n   { $group: { _id: null, myCount: { $sum: 1 } } },\r\n   { $project: { _id: 0 } }\r\n ]);\r\n<\/pre>\n<p><span style=\"color: #0000ff;\">Observa\u00e7\u00f5es:<\/span><\/p>\n<p>Essa \u00e9 uma consulta de uni\u00e3o externa \u00e0 esquerda bastante simples que une duas cole\u00e7\u00f5es e, em seguida, simplesmente conta o n\u00famero total de documentos produzidos.  Observe que, diferentemente do N1QL (e do SQL), no MongoDB, voc\u00ea ainda precisa agrupar o conjunto de resultados para obter a contagem, mesmo que tenha um \u00fanico grupo.<\/p>\n<p><span style=\"font-weight: 400; color: #0000ff;\">Exemplo 2: Liste os aeroportos e pontos de refer\u00eancia na mesma cidade, ordenados pelos aeroportos.<\/span><\/p>\n<p><span style=\"color: #ff0000;\">Couchbase N1QL:<\/span><\/p>\n<pre class=\"theme:github font:courier-new wrap:true whitespace-before:1 whitespace-after:1 lang:mysql decode:true\" title=\"Consulta no Couchbase N1QL\">SELECT landmark.name AS Landmark_Name,\r\n       MIN(airport.airportname) AS Airport_Name,\r\n       MIN(airport.tz) AS Landmark_Time\r\nFROM `travel-sample` airport INNER JOIN `travel-sample` landmark\r\n      ON airport.city = landmark.city\r\nWHERE landmark.country = \"United States\"\r\n      AND airport.type = \"airport\"\r\n      AND landmark.type = \"landmark\"\r\nGROUP BY landmark.name\r\nORDER BY Airport_Name\r\n<\/pre>\n<p><span style=\"color: #008000;\">MongoDB:<\/span><\/p>\n<pre class=\"theme:github font:courier-new wrap:true whitespace-before:1 whitespace-after:1 lang:js decode:true\" title=\"Consulta convertida no MongoDB\">db.airport.aggregate([\r\n   {\r\n     $lookup:\r\n       {\r\n         from:\"landmark\",\r\n         localField: \"city\",\r\n         foreignField: \"city\",\r\n         as: \"aplm_docs\"\r\n       }\r\n   },\r\n   {\r\n      $match: {\"airline_docs\": {$ne: []}}\r\n   },\r\n   {  $unwind: { path: \"$aplm_docs\", preserveNullAndEmptyArrays: true }},\r\n   {  $group: {\r\n      _id: \"$aplm_docs.name\",\r\n      Airport_Name: { $min: \"$airportname\" } ,\r\n      Landmark_Time: { $min: \"$tz\"}\r\n     }\r\n   },\r\n   { $sort : { Airport_Name: 1 } },\r\n   { $project: { _id: 1, Airport_Name:1, Landmark_Time:1  } }\r\n ]);\r\n<\/pre>\n<p><span style=\"color: #0000ff;\">Observa\u00e7\u00f5es:<\/span><\/p>\n<ol>\n<li>Essa consulta usa INNER JOIN, que o MongoDB n\u00e3o tem.  Portanto, no MongoDB, voc\u00ea primeiro faz a jun\u00e7\u00e3o de pesquisa para obter o LEFT OUTER JOIN e, em seguida, elimina documentos n\u00e3o correspondentes, mas projetados (por causa do left outer) usando o est\u00e1gio de correspond\u00eancia (c\u00f3digo: $match: {\"airline_docs\": {$ne: []}}).<\/li>\n<li>Em seguida, lembre-se de que os documentos correspondentes est\u00e3o em uma estrutura de dados de matriz, desenrole-os antes de agrup\u00e1-los pelo landmark.name.   Em seguida, fa\u00e7a a classifica\u00e7\u00e3o e a proje\u00e7\u00e3o final.<\/li>\n<\/ol>\n<p>Como esperado, a consulta de jun\u00e7\u00e3o do MongoDB \u00e9 processual e voc\u00ea precisa entender o plano de execu\u00e7\u00e3o e escrever o c\u00f3digo para cada est\u00e1gio.<\/p>\n<p><span style=\"color: #0000ff;\">Exemplo 3: partindo de S\u00e3o Francisco, encontre todos os aeroportos de destino (aqueles que t\u00eam rotas a partir de SFO).<\/span><\/p>\n<p><span style=\"color: #ff0000;\">Couchbase N1QL<\/span><\/p>\n<pre class=\"theme:github font:courier-new wrap:true whitespace-before:1 whitespace-after:1 lang:mysql decode:true\" title=\"Consulta N1QL\">SELECT DISTINCT route.destinationairport\r\nFROM `travel-sample` airport JOIN `travel-sample` route\r\n     ON (airport.faa = route.sourceairport AND route.type = \"route\")\r\nWHERE airport.type = \"airport\"\r\n  AND airport.city = \"San Francisco\"\r\n  AND airport.country = \"United States\"\r\nORDER BY route.destinationairport\r\n<\/pre>\n<p><span style=\"color: #008000;\">MongoDB:<\/span><\/p>\n<pre class=\"theme:github font:courier-new wrap:true whitespace-before:1 whitespace-after:1 lang:js decode:true\" title=\"Convertido em uma consulta do MongoDB.\">db.airport.aggregate([\r\n   {\r\n      $match: {\r\n          $and: [\r\n            {\"type\": \"airport\"},\r\n            { city: \"San Francisco\"},\r\n            { \"country\": \"United States\"}\r\n          ]\r\n      }\r\n   },\r\n   {\r\n     $lookup:\r\n       {\r\n         from:\"route\",\r\n         let: { rfaa : \"$faa\"},\r\n         pipeline: [\r\n           { $match:\r\n               { $expr:\r\n                 { $and:\r\n                   [\r\n                     { $eq: [\"$sourceairport\", \"$$rfaa\"]} ,\r\n                     { $eq: [\"$type\", \"route\"] }\r\n                   ]\r\n\r\n                }\r\n              }\r\n           }\r\n         ],\r\n         as: \"airline_docs\"\r\n       }\r\n   },\r\n   { $match: {\"airline_docs\": {$ne: []}} },\r\n   {  $unwind: { path: \"$airline_docs\", preserveNullAndEmptyArrays: true }},\r\n   { $project: { _id:0,  \"airline_docs.destinationairport\" : 1 }},\r\n   { $group: {\r\n      _id : \"$airline_docs.destinationairport\"\r\n     }\r\n   },\r\n   { $sort: { _id : 1 }},\r\n ]);\r\n<\/pre>\n<p><span style=\"color: #0000ff;\">Observa\u00e7\u00f5es:<\/span><\/p>\n<ol>\n<li>A cl\u00e1usula de uni\u00e3o para essa consulta \u00e9 um pouco mais complexa, com dois predicados (airport.faa = (route.sourceairport AND route.type = \"route\").  Isso requer uma sintaxe de pipeline complicada na consulta do MongoDB.<\/li>\n<li>E como voc\u00ea precisa diferenciar as duas cole\u00e7\u00f5es, \u00e9 necess\u00e1rio outro est\u00e1gio do let para criar as vari\u00e1veis locais para os atributos do aeroporto.<\/li>\n<li>Como antes, \u00e9 necess\u00e1ria uma cl\u00e1usula de correspond\u00eancia adicional para eliminar documentos de companhias a\u00e9reas sem correspond\u00eancia (vazios), seguida de agrupamento e classifica\u00e7\u00e3o.<\/li>\n<li>Como voc\u00ea pode ver visualmente, a consulta do MongoDB est\u00e1 ficando cada vez maior para fazer o mesmo trabalho que o N1QL do Couchbase.<\/li>\n<\/ol>\n<p><span style=\"color: #0000ff;\">Exemplo 4: Encontre todos os hot\u00e9is e pontos de refer\u00eancia em Yosemite.  Os hot\u00e9is devem ter <\/span>m\u00ednimo<span style=\"color: #0000ff;\"> 5 curtidas.<\/span><\/p>\n<p><span style=\"color: #ff0000;\">Couchbase N1QL<\/span><\/p>\n<pre class=\"theme:github font:courier-new wrap:true whitespace-before:1 whitespace-after:1 lang:mysql decode:true\" title=\"Consulta N1QL do Couchbase\">SELECT hotel.name hotel_name, landmark.name landmark_name, landmark.activity\r\nFROM `travel-sample` hotel INNER JOIN `travel-sample` landmark\r\n    ON (hotel.city = landmark.city \r\n        AND hotel.country = landmark.country \r\n        AND landmark.type = \"landmark\")\r\nWHERE hotel.type = \"hotel\" \r\n  AND hotel.title like \"Yosemite%\" \r\n  AND array_length(hotel.public_likes) &gt; 5;\r\n<\/pre>\n<p><span style=\"color: #008000;\">MongoDB:<\/span><\/p>\n<pre class=\"theme:github font:courier-new wrap:true whitespace-before:1 whitespace-after:1 lang:js decode:true\" title=\"Consulta convertida do MongoDB.\">db.hotel.aggregate([\r\n   { $match:  { title: { $regex: \/^Yosemite\/ } }, },\r\n   {\r\n     $lookup:\r\n       {\r\n         from:\"landmark\",\r\n         let: { hcity : \"$city\", hcountry : \"$country\"},\r\n         pipeline: [\r\n           { $match:\r\n               { $expr:\r\n                 { $and:\r\n                   [\r\n                     { $eq: [\"$city\", \"$$hcity\"]} ,\r\n                     { $eq: [\"$country\", \"$$hcountry\"] }\r\n                   ]\r\n                }\r\n              }\r\n           }\r\n         ],\r\n         as: \"hotel_lm_docs\"\r\n       }\r\n   },\r\n   { $match : {\"hotel_lm_docs\": { $ne: [] }}},\r\n   { $project: {_id:0, hname: \"$name\", public_likes: 1, hotel_lm_docs:1}},\r\n   { $unwind: { path: \"$hotel_lm_docs\", preserveNullAndEmptyArrays: true }},\r\n   { $project: { _id: 1, hname : 1 , \"hotel_lm_docs.name\" : 1, \"hotel_lm_docs.name\" : 1, \"hotel_lm_docs.activity\" : 1, mt5 : {$gt: [ {$size: \"$public_likes\"}, 5]}}},\r\n   { $match: { mt5 : true } },\r\n   { $project: {_$id:0}}\r\n ]);\r\n<\/pre>\n<p><span style=\"color: #0000ff;\">Observa\u00e7\u00e3o:<\/span><\/p>\n<ol>\n<li>Traduzir o predicado LIKE em uma express\u00e3o regular foi simples, mas determinar se havia pelo menos cinco public_likes n\u00e3o foi.  Foi necess\u00e1ria uma fase adicional de proje\u00e7\u00e3o e correspond\u00eancia para calcular o tamanho dos public_likes no final.<\/li>\n<li>Quando voc\u00ea tem muitos atributos para combinar, manipular e projetar, \u00e9 necess\u00e1rio renome\u00e1-los adequadamente no est\u00e1gio apropriado, caso contr\u00e1rio, a consulta n\u00e3o poder\u00e1 fazer refer\u00eancia a eles.  Por exemplo, hotel.name teve de ser renomeado para hname antes do desenrolar.  Talvez haja uma maneira melhor de escrever esse est\u00e1gio!<\/li>\n<li>O N1QL expressou a consulta em 370 caracteres. O MongoDB exigiu 956 caracteres.  Tudo isso para uma jun\u00e7\u00e3o de duas tabelas.  \u00c0 medida que a complexidade aumenta, a propor\u00e7\u00e3o tamb\u00e9m aumenta, pois a consulta do MongoDB \u00e9 escrita de forma processual.<\/li>\n<\/ol>\n<p><span style=\"color: #0000ff;\">Exemplo 5: Encontre todos os hot\u00e9is e pontos de refer\u00eancia em Yosemite.  Os hot\u00e9is devem ter pelo menos 5 curtidas.<\/span><\/p>\n<p>Esse exemplo \u00e9 igual ao Exemplo 4, mas mais r\u00e1pido!<\/p>\n<p><span style=\"color: #ff0000;\">Couchbase N1QL<\/span><\/p>\n<pre class=\"theme:github font:courier-new wrap:true whitespace-before:1 whitespace-after:1 lang:mysql decode:true\" title=\"Consulta N1QL do Couchbase\">SELECT hotel.name hotel_name, landmark.name landmark_name, landmark.activity\r\nFROM `travel-sample` hotel INNER JOIN `travel-sample` landmark USE HASH(build)\r\n    ON (hotel.city = landmark.city \r\n        AND hotel.country = landmark.country \r\n        AND landmark.type = \"landmark\")\r\nWHERE hotel.type = \"hotel\"\r\n  AND hotel.title like \"Yosemite%\" \r\n  AND array_length(hotel.public_likes) &gt; 5;\r\n<\/pre>\n<p><span style=\"color: #0000ff;\">Observa\u00e7\u00e3o:<\/span><\/p>\n<p>O m\u00e9todo de jun\u00e7\u00e3o padr\u00e3o no Couchbase N1QL \u00e9 a jun\u00e7\u00e3o de loop aninhado.  Isso funciona bem quando voc\u00ea tem um n\u00famero menor de documentos envolvidos em cada lado da uni\u00e3o.  Quando voc\u00ea tem um conjunto de dados maior, normalmente em consultas de relat\u00f3rios, a jun\u00e7\u00e3o de loop aninhado fica mais lenta.  O Couchbase N1QL tem jun\u00e7\u00f5es de hash e isso acelera significativamente as jun\u00e7\u00f5es.  Quando cada lado da uni\u00e3o tem de milhares a milh\u00f5es de documentos, o aumento de velocidade pode ser de 2x a 20x ou mais. Veja a se\u00e7\u00e3o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/ansi-join-support-n1ql\/\">blog detalhado do Couchbase<\/a> sobre jun\u00e7\u00f5es ANSI para obter mais informa\u00e7\u00f5es.<\/p>\n<p>Com base na documenta\u00e7\u00e3o e no plano de explica\u00e7\u00e3o, n\u00e3o est\u00e1 claro qual m\u00e9todo de jun\u00e7\u00e3o o MongoDB usa. Alguns blogs indicam que eles usaram uma jun\u00e7\u00e3o de loop aninhado para implementar o operador $lookup.<\/p>\n<p><strong>Resumo:<\/strong><\/p>\n<p>&nbsp;<\/p>\n<table>\n<tbody>\n<tr>\n<td><\/td>\n<td><span style=\"color: #ff0000;\"><b>Couchbase N1QL<\/b><\/span><\/td>\n<td><span style=\"color: #008000;\"><b>MongoDB<\/b><\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Abordagem JOIN<\/b><\/td>\n<td><span style=\"font-weight: 400;\">Declarativo, como o SQL.<\/span><\/p>\n<p>Permite a uni\u00e3o entre conjuntos de dados distribu\u00eddos e de qualquer tamanho.<\/td>\n<td><span style=\"font-weight: 400;\">Procedimental com alguns aspectos declarativos (por exemplo, sele\u00e7\u00e3o de \u00edndices).<\/span><\/p>\n<p>S\u00f3 \u00e9 poss\u00edvel ingressar em uma cole\u00e7\u00e3o fragmentada em um\u00a0<strong>cole\u00e7\u00e3o n\u00e3o fragmentada.\u00a0<\/strong>Para unir duas cole\u00e7\u00f5es fragmentadas, os aplicativos ter\u00e3o que escrever o algoritmo de uni\u00e3o.<\/td>\n<\/tr>\n<tr>\n<td><b>JOINs suportados<\/b><\/td>\n<td><span style=\"font-weight: 400;\">UNI\u00c3O EXTERNA ESQUERDA<\/span><\/p>\n<p><span style=\"font-weight: 400;\">INNER JOIN<\/span><\/p>\n<p><span style=\"font-weight: 400;\">UNI\u00c3O EXTERNA DIREITA<\/span><\/td>\n<td><span style=\"font-weight: 400;\">O $lookup implementa o LEFT OUTER JOIN em valores escalares.<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Suporte \u00e0 cl\u00e1usula ON<\/b><\/td>\n<td><span style=\"font-weight: 400;\">Express\u00f5es completas.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Cicatrizes<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Matrizes<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Igualdade impl\u00edcita<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Express\u00e3o do pipeline<\/span><\/p>\n<p><span style=\"font-weight: 400;\">As matrizes devem ser $unwind antes do $lookup<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Implementa\u00e7\u00e3o do JOIN<\/b><\/td>\n<td><span style=\"font-weight: 400;\">Bloqueio de loop aninhado<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Jun\u00e7\u00e3o de hash com constru\u00e7\u00e3o e sondas definidas pelo usu\u00e1rio.<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Loop aninhado<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Cl\u00e1usula ON<\/b><\/td>\n<td><span style=\"font-weight: 400;\">ON com qualquer express\u00e3o.<\/span><\/td>\n<td><span style=\"font-weight: 400;\">1TP4Express\u00e3o de linha de produ\u00e7\u00e3o<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Express\u00f5es de matriz na cl\u00e1usula ON<\/b><\/td>\n<td><span style=\"font-weight: 400;\">Use express\u00f5es ANY, IN.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Suporta UNNEST<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Pipeline com $unwind antes de $match<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Explicar<\/b><\/td>\n<td><span style=\"font-weight: 400;\">Explica\u00e7\u00e3o visual e <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Explica\u00e7\u00e3o JSON<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Explica\u00e7\u00e3o visual e<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Explica\u00e7\u00e3o JSON<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>JOIN order<\/b><\/td>\n<td><span style=\"font-weight: 400;\">Da esquerda para a direita, conforme especificado pelo usu\u00e1rio. O otimizador \u00e9 baseado em regras.<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Conforme especificado no pipeline.<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>JOINs aninhados<\/b><\/td>\n<td><span style=\"font-weight: 400;\">Suportado por meio de tabelas derivadas.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A cl\u00e1usula FROM pode ter subsele\u00e7\u00f5es que, por sua vez, podem ter uni\u00f5es ou subsele\u00e7\u00f5es.<\/span><\/td>\n<td><span style=\"font-weight: 400;\">N\u00e3o<\/span><\/td>\n<\/tr>\n<tr>\n<td><b>Processamento do predicado JOIN<\/b><\/td>\n<td><span style=\"font-weight: 400;\">O otimizador processa os predicados de uni\u00e3o, os predicados constantes e os envia automaticamente para o \u00edndice.<\/span><\/td>\n<td><span style=\"font-weight: 400;\">Projeto manual de predicados para cada cole\u00e7\u00e3o, ordena\u00e7\u00e3o cuidadosa dos est\u00e1gios do pipeline sem a ajuda total do otimizador.<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>E quanto ao desempenho?  Boa pergunta.  Isso \u00e9 para um blog futuro!<\/p>\n<p><strong><span style=\"color: #000000;\">E agora, uma cita\u00e7\u00e3o:<\/span><\/strong><\/p>\n<p><span style=\"font-weight: 400;\">\"Uma frase n\u00e3o deve conter palavras desnecess\u00e1rias, um par\u00e1grafo n\u00e3o deve conter frases desnecess\u00e1rias, pelo mesmo motivo que um desenho n\u00e3o deve ter linhas desnecess\u00e1rias e uma m\u00e1quina n\u00e3o deve ter pe\u00e7as desnecess\u00e1rias.\"<\/span><\/p>\n<p><span style=\"font-weight: 400;\"> - William Strunk, Jr.\u00a0 <a href=\"https:\/\/www.amazon.com\/Elements-Style-William-Strunk-Jr\/dp\/194564401X\">Elementos de estilo<\/a>.<\/span><\/p>\n<p><strong>Refer\u00eancias:<\/strong><\/p>\n<ol>\n<li>Documenta\u00e7\u00e3o do Couchbase: <a href=\"https:\/\/docs.couchbase.com\">https:\/\/docs.couchbase.com<\/a><\/li>\n<li>Documenta\u00e7\u00e3o do MongoDB:\u00a0<a href=\"https:\/\/docs.mongodb.com\/\">https:\/\/docs.mongodb.com\/<\/a><\/li>\n<li>Uni\u00f5es ANSI no Couchbase N1QL:\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/ansi-join-support-n1ql\/\">https:\/\/www.couchbase.com\/blog\/ansi-join-support-n1ql\/<\/a><\/li>\n<li>Tutorial N1QL:\u00a0<a href=\"https:\/\/query-tutorial.couchbase.com\/tutorial\/#1\">https:\/\/query-tutorial.couchbase.com\/tutorial\/#1<\/a><\/li>\n<\/ol>","protected":false},"excerpt":{"rendered":"<p>As NoSQL databases evolved, each added higher level APIs or languages to help programmers to complex things easily. SQL, having done that for relational data, showed the way. In SQL, developers say WHAT needs to be done and the database [&hellip;]<\/p>","protected":false},"author":55,"featured_media":5471,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1821,1816,1819,9417,1812],"tags":[1309],"ppma_author":[8929],"class_list":["post-5470","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-couchbase-architecture","category-couchbase-server","category-data-modeling","category-performance","category-n1ql-query","tag-mongodb"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Join JSON: Couchbase N1QL vs. MongoDB Query<\/title>\n<meta name=\"description\" content=\"This article discusses how to join JSON documents while comparing Couchbase vs. MongoDB. Follow along as we review several real-world examples.\" \/>\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-json-comparing-couchbase-n1ql-mongodb\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Join JSON: Couchbase N1QL vs. MongoDB Query\" \/>\n<meta property=\"og:description\" content=\"This article discusses how to join JSON documents while comparing Couchbase vs. MongoDB. Follow along as we review several real-world examples.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/joining-json-comparing-couchbase-n1ql-mongodb\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-07-12T06:07:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:20:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/Screen-Shot-2018-04-22-at-8.52.36-PM-e1531517244183.png\" \/>\n\t<meta property=\"og:image:width\" content=\"700\" \/>\n\t<meta property=\"og:image:height\" content=\"294\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Keshav Murthy\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@rkeshavmurthy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Keshav Murthy\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 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-json-comparing-couchbase-n1ql-mongodb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/\"},\"author\":{\"name\":\"Keshav Murthy\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636\"},\"headline\":\"How to Join JSON: Couchbase N1QL vs. MongoDB Query\",\"datePublished\":\"2018-07-12T06:07:33+00:00\",\"dateModified\":\"2025-06-14T03:20:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/\"},\"wordCount\":1656,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/Screen-Shot-2018-04-22-at-8.52.36-PM-e1531517244183.png\",\"keywords\":[\"mongodb\"],\"articleSection\":[\"Application Design\",\"Couchbase Architecture\",\"Couchbase Server\",\"Data Modeling\",\"High Performance\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/\",\"name\":\"How to Join JSON: Couchbase N1QL vs. MongoDB Query\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/Screen-Shot-2018-04-22-at-8.52.36-PM-e1531517244183.png\",\"datePublished\":\"2018-07-12T06:07:33+00:00\",\"dateModified\":\"2025-06-14T03:20:03+00:00\",\"description\":\"This article discusses how to join JSON documents while comparing Couchbase vs. MongoDB. Follow along as we review several real-world examples.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/Screen-Shot-2018-04-22-at-8.52.36-PM-e1531517244183.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/Screen-Shot-2018-04-22-at-8.52.36-PM-e1531517244183.png\",\"width\":700,\"height\":294},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Join JSON: Couchbase N1QL vs. MongoDB Query\"}]},{\"@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\/c261644262bf98e146372fe647682636\",\"name\":\"Keshav Murthy\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4e51d72fc07c662aa791316deafffac4\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g\",\"caption\":\"Keshav Murthy\"},\"description\":\"Keshav Murthy is a Vice President at Couchbase R&amp;D. Previously, he was at MapR, IBM, Informix, Sybase, with more than 20 years of experience in database design &amp; development. He lead the SQL and NoSQL R&amp;D team at IBM Informix. He has received two President's Club awards at Couchbase, two Outstanding Technical Achievement Awards at IBM. Keshav has a bachelor's degree in Computer Science and Engineering from the University of Mysore, India, holds eleven US patents and has four US patents pending.\",\"sameAs\":[\"https:\/\/blog.planetnosql.com\/\",\"https:\/\/x.com\/rkeshavmurthy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/keshav-murthy\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Como unir JSON: consulta N1QL do Couchbase vs. consulta do MongoDB","description":"Este artigo discute como unir documentos JSON ao comparar o Couchbase com o MongoDB. Acompanhe a an\u00e1lise de v\u00e1rios exemplos do mundo real.","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-json-comparing-couchbase-n1ql-mongodb\/","og_locale":"pt_BR","og_type":"article","og_title":"How to Join JSON: Couchbase N1QL vs. MongoDB Query","og_description":"This article discusses how to join JSON documents while comparing Couchbase vs. MongoDB. Follow along as we review several real-world examples.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/joining-json-comparing-couchbase-n1ql-mongodb\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-07-12T06:07:33+00:00","article_modified_time":"2025-06-14T03:20:03+00:00","og_image":[{"width":700,"height":294,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/Screen-Shot-2018-04-22-at-8.52.36-PM-e1531517244183.png","type":"image\/png"}],"author":"Keshav Murthy","twitter_card":"summary_large_image","twitter_creator":"@rkeshavmurthy","twitter_misc":{"Written by":"Keshav Murthy","Est. reading time":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/"},"author":{"name":"Keshav Murthy","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c261644262bf98e146372fe647682636"},"headline":"How to Join JSON: Couchbase N1QL vs. MongoDB Query","datePublished":"2018-07-12T06:07:33+00:00","dateModified":"2025-06-14T03:20:03+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/"},"wordCount":1656,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/Screen-Shot-2018-04-22-at-8.52.36-PM-e1531517244183.png","keywords":["mongodb"],"articleSection":["Application Design","Couchbase Architecture","Couchbase Server","Data Modeling","High Performance","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/","url":"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/","name":"Como unir JSON: consulta N1QL do Couchbase vs. consulta do MongoDB","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/Screen-Shot-2018-04-22-at-8.52.36-PM-e1531517244183.png","datePublished":"2018-07-12T06:07:33+00:00","dateModified":"2025-06-14T03:20:03+00:00","description":"Este artigo discute como unir documentos JSON ao comparar o Couchbase com o MongoDB. Acompanhe a an\u00e1lise de v\u00e1rios exemplos do mundo real.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/Screen-Shot-2018-04-22-at-8.52.36-PM-e1531517244183.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2018\/07\/Screen-Shot-2018-04-22-at-8.52.36-PM-e1531517244183.png","width":700,"height":294},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/joining-json-comparing-couchbase-n1ql-mongodb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Join JSON: Couchbase N1QL vs. MongoDB Query"}]},{"@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\/c261644262bf98e146372fe647682636","name":"Keshav Murthy","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4e51d72fc07c662aa791316deafffac4","url":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","caption":"Keshav Murthy"},"description":"Keshav Murthy \u00e9 vice-presidente de P&amp;D da Couchbase. Anteriormente, ele trabalhou na MapR, IBM, Informix e Sybase, com mais de 20 anos de experi\u00eancia em design e desenvolvimento de bancos de dados. Ele liderou a equipe de P&amp;D de SQL e NoSQL na IBM Informix. Ele recebeu dois pr\u00eamios President's Club na Couchbase e dois Outstanding Technical Achievement Awards na IBM. Keshav \u00e9 bacharel em Ci\u00eancia da Computa\u00e7\u00e3o e Engenharia pela Universidade de Mysore, \u00cdndia, det\u00e9m onze patentes nos EUA e tem quatro patentes pendentes nos EUA.","sameAs":["https:\/\/blog.planetnosql.com\/","https:\/\/x.com\/rkeshavmurthy"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/keshav-murthy\/"}]}},"authors":[{"term_id":8929,"user_id":55,"is_guest":0,"slug":"keshav-murthy","display_name":"Keshav Murthy","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/af74df754db27152971d0aed2f323ead5a1f9fe5afd0209af91e12e784451224?s=96&d=mm&r=g","author_category":"","last_name":"Murthy","first_name":"Keshav","job_title":"","user_url":"https:\/\/blog.planetnosql.com\/","description":"Keshav Murthy \u00e9 vice-presidente de P&amp;D da Couchbase. Anteriormente, ele trabalhou na MapR, IBM, Informix e Sybase, com mais de 20 anos de experi\u00eancia em design e desenvolvimento de bancos de dados. Ele liderou a equipe de P&amp;D de SQL e NoSQL na IBM Informix. Recebeu dois pr\u00eamios President's Club na Couchbase e dois Outstanding Technical Achievement Awards na IBM. Keshav \u00e9 bacharel em Ci\u00eancia da Computa\u00e7\u00e3o e Engenharia pela Universidade de Mysore, \u00cdndia, det\u00e9m dez patentes nos EUA e tem tr\u00eas patentes pendentes nos EUA."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/5470","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\/55"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=5470"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/5470\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/5471"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=5470"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=5470"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=5470"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=5470"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}