{"id":17369,"date":"2025-07-25T10:09:07","date_gmt":"2025-07-25T17:09:07","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=17369"},"modified":"2025-08-13T06:52:59","modified_gmt":"2025-08-13T13:52:59","slug":"choosing-the-right-query-language-sql-vs-mongo","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/choosing-the-right-query-language-sql-vs-mongo\/","title":{"rendered":"Escolhendo a linguagem de consulta correta: SQL++ vs. Mongo"},"content":{"rendered":"<p>Quando voc\u00ea est\u00e1 criando aplicativos, a linguagem de consulta com a qual voc\u00ea trabalha faz uma grande diferen\u00e7a. Ela afeta tudo, desde o desempenho at\u00e9 a rapidez com que sua equipe pode enviar recursos. Nesta publica\u00e7\u00e3o, pedi a um LLM que criasse uma lista de 21 crit\u00e9rios classificados como os mais valiosos para decidir qual linguagem de consulta usar. Examinaremos cada um deles e mostraremos como as linguagens SQL++, usada pelo Couchbase, e a Query API do Mongo (anteriormente conhecida como MQL) se comparam.<\/p>\n<p>Se voc\u00ea estiver avaliando bancos de dados para um novo projeto ou apenas curioso sobre as diferen\u00e7as entre essas duas abordagens, isso deve lhe dar uma vis\u00e3o clara de onde cada um se destaca e onde pode ficar aqu\u00e9m.<\/p>\n<h2 style=\"font-weight: 400;\">Expressividade<\/h2>\n<p>O SQL++ permite que voc\u00ea escreva consultas ricas e complexas - uni\u00f5es, subconsultas, agregados, fun\u00e7\u00f5es de janela - enquanto trabalha com dados de documentos flex\u00edveis. \u00c9 poss\u00edvel expressar quase tudo o que voc\u00ea esperaria de um SQL, al\u00e9m do suporte nativo a JSON.<\/p>\n<p>A linguagem de consulta do Mongo \u00e9 mais limitada. Voc\u00ea pode fazer muito com o pipeline de agrega\u00e7\u00e3o, mas expressar jun\u00e7\u00f5es de v\u00e1rias cole\u00e7\u00f5es ou subconsultas profundas pode se tornar prolixo e exigir solu\u00e7\u00f5es alternativas ou constru\u00e7\u00f5es avan\u00e7adas de pipeline.<\/p>\n<table>\n<tbody>\n<tr>\n<th><strong>SQL++<\/strong><\/th>\n<th><strong>Mongo<\/strong><\/th>\n<\/tr>\n<tr>\n<td>\n<pre>SELECT c.name, o.total\r\nFROM customers c\r\nJOIN orders o ON c.id = o.customer_id\r\nWHERE o.total &gt; 100\r\nORDER BY o.total DESC;<\/pre>\n<\/td>\n<td>O Mongo exige um pipeline mais processual:<\/p>\n<pre class=\"\">db.orders.aggregate([\r\n\u00a0 { $match: { total: { $gt: 100 } } },\r\n\u00a0 { $lookup: {\r\n\u00a0 \u00a0 \u00a0 from: \"customers\",\r\n\u00a0 \u00a0 \u00a0 localField: \"customer_id\",\r\n\u00a0 \u00a0 \u00a0 foreignField: \"id\",\r\n\u00a0 \u00a0 \u00a0 as: \"customer\"\r\n\u00a0 \u00a0 }\r\n\u00a0 },\r\n\u00a0 { $unwind: \"$customer\" },\r\n\u00a0 { $project: { name: \"$customer.name\", total: 1 } },\r\n\u00a0 { $sort: { total: -1 } }\r\n]);\r\n<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 style=\"font-weight: 400;\">Legibilidade<\/h2>\n<p>O SQL++ \u00e9 declarativo e familiar a qualquer pessoa com experi\u00eancia em SQL. A inten\u00e7\u00e3o da consulta \u00e9 f\u00e1cil de ver.<\/p>\n<pre>SELECT name, age\r\nFROM users\r\nWHERE age &gt;= 21\r\nORDER BY name;\r\n<\/pre>\n<p>O pipeline do Mongo \u00e9 mais detalhado e processual - voc\u00ea precisa percorrer mentalmente cada est\u00e1gio.<\/p>\n<pre>db.users.find(\r\n\u00a0 { age: { $gte: 21 } },\r\n\u00a0 { name: 1, age: 1, _id: 0 }\r\n).sort({ name: 1 });\r\n<\/pre>\n<p>Para consultas simples, isso n\u00e3o \u00e9 <b>terr\u00edvel<\/b>. Mas, \u00e0 medida que as consultas aumentam (uni\u00f5es, subconsultas, agrega\u00e7\u00f5es), a legibilidade pode cair rapidamente no formato de pipeline do Mongo.<\/p>\n<h2 style=\"font-weight: 400;\">Consist\u00eancia<\/h2>\n<p>O SQL++ \u00e9 altamente consistente. A sintaxe e a sem\u00e2ntica s\u00e3o previs\u00edveis, e ele se parece com o \"SQL para documentos\" em todos os aspectos.<\/p>\n<p>Exemplo com dados aninhados:<\/p>\n<pre>SELECT u.name, a.city\r\nFROM users u\r\nUNNEST u.addresses AS a\r\nWHERE a.country = \"USA\";\r\n<\/pre>\n<p>No Mongo, a consulta de estruturas aninhadas geralmente requer a mudan\u00e7a para nota\u00e7\u00e3o de ponto ou operadores de matriz, e os pipelines usam um estilo diferente do <em>find()<\/em>. Voc\u00ea acaba aprendendo v\u00e1rias sintaxes:<\/p>\n<p>Consulta simples com nota\u00e7\u00e3o de ponto:<\/p>\n<pre>db.users.find(\r\n\u00a0 { \"addresses.country\": \"USA\" },\r\n\u00a0 { name: 1, \"addresses.city\": 1, _id: 0 }\r\n);\r\n<\/pre>\n<p>Mais complexo? Voc\u00ea est\u00e1 de volta \u00e0 terra da agrega\u00e7\u00e3o:<\/p>\n<pre>db.users.aggregate([\r\n\u00a0 { $unwind: \"$addresses\" },\r\n\u00a0 { $match: { \"addresses.country\": \"USA\" } },\r\n\u00a0 { $project: { name: 1, city: \"$addresses.city\", _id: 0 } }\r\n]);\r\n<\/pre>\n<h2 style=\"font-weight: 400;\">Desempenho<\/h2>\n<p>Quando se trata de desempenho bruto, o Couchbase SQL++ supera consistentemente a linguagem de consulta do MongoDB em benchmarks, especialmente em cargas de trabalho de alta taxa de transfer\u00eancia e baixa lat\u00eancia.<\/p>\n<p>O Couchbase demonstrou escalabilidade e efici\u00eancia superiores em v\u00e1rios benchmarks. Por exemplo, no Yahoo! Cloud Serving Benchmark (YCSB), o Couchbase exibiu <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/benchmarks\/\" target=\"_blank\" rel=\"noopener\">desempenho significativamente melhor no aumento de escala<\/a> em compara\u00e7\u00e3o com o MongoDB.<\/p>\n<p>Al\u00e9m dos benchmarks, os clientes do Couchbase relataram melhorias significativas no desempenho:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/customers\/fico\/\" target=\"_blank\" rel=\"noopener\">A FICO escolheu o Couchbase em vez do MongoDB<\/a> para obter um tempo de resposta &lt;1 ms<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/customers\/linkedin\/\" target=\"_blank\" rel=\"noopener\">O LinkedIn escolheu o Couchbase em vez do MongoDB<\/a> para executar mais de 10 milh\u00f5es de consultas por segundo<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>A vers\u00e3o mais recente do MongoDB, embora tenha melhorado em rela\u00e7\u00e3o \u00e0s vers\u00f5es anteriores, ainda est\u00e1 defasada em determinados cen\u00e1rios. O MongoDB 8.0 introduziu aprimoramentos de desempenho, alcan\u00e7ando cargas de trabalho mistas de leitura\/grava\u00e7\u00e3o mais r\u00e1pidas em compara\u00e7\u00e3o com o MongoDB 7.0. No entanto, essas melhorias s\u00e3o relativas ao seu pr\u00f3prio desempenho anterior e podem n\u00e3o corresponder \u00e0 escalabilidade e \u00e0 velocidade demonstradas pelo Couchbase em benchmarks independentes (como o <a href=\"https:\/\/benchant.com\/ranking\/database-ranking\" target=\"_blank\" rel=\"noopener\">Classifica\u00e7\u00e3o do banco de dados BenchANT<\/a>).<\/p>\n<h2 style=\"font-weight: 400;\">Suporte a \u00edndices<\/h2>\n<p>O SQL++ oferece suporte a um <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/create-right-index-get-right-performance\/\" target=\"_blank\" rel=\"noopener\">amplo conjunto de \u00edndices<\/a>: prim\u00e1rio, secund\u00e1rio, composto, matriz, parcial, cobertura, FTS - todos utiliz\u00e1veis em um \u00fanico idioma.<\/p>\n<p>O Mongo \u00e9 compat\u00edvel com o sistema prim\u00e1rio (<em>em _id<\/em>), secund\u00e1rio, composto, multichave, texto e \u00edndices com hash. Ele \u00e9 robusto, mas n\u00e3o tem a flexibilidade do SQL++ quando se trata de indexar campos ou express\u00f5es profundamente aninhados.<\/p>\n<p>Exemplo com \u00edndice parcial em SQL++:<\/p>\n<pre>CREATE INDEX idx_active_users ON users(email)\r\nWHERE active = TRUE;\r\n<\/pre>\n<p>O \u00edndice parcial do Mongo \u00e9 semelhante:<\/p>\n<pre>db.users.createIndex(\r\n\u00a0 { email: 1 },\r\n\u00a0 { partialFilterExpression: { active: true } }\r\n);\r\n<\/pre>\n<h2 style=\"font-weight: 400;\">Recursos de uni\u00e3o<\/h2>\n<p>O SQL++ suporta a sintaxe JOIN completa - interna e externa esquerda, <em>IN\u00daTIL<\/em>e combina\u00e7\u00f5es. Ele trata os documentos como cidad\u00e3os de primeira classe em consultas de estilo relacional.<\/p>\n<p>Exemplo:<\/p>\n<pre>SELECT u.name, o.total\r\nFROM users u\r\nJOIN orders o ON u.id = o.user_id\r\nWHERE o.total &gt; 100;\r\n<\/pre>\n<p>Mongo's <em>$lookup<\/em> suporta pipelines mais expressivos desde a vers\u00e3o 5.0, mas ainda \u00e9 <em>ESQUERDA EXTERIOR<\/em> e n\u00e3o possui a sintaxe completa de jun\u00e7\u00e3o.<\/p>\n<pre>db.orders.aggregate([\r\n\u00a0 { $match: { total: { $gt: 100 } } },\r\n\u00a0 { $lookup: {\r\n\u00a0 \u00a0 \u00a0 from: \"users\",\r\n\u00a0 \u00a0 \u00a0 localField: \"user_id\",\r\n\u00a0 \u00a0 \u00a0 foreignField: \"id\",\r\n\u00a0 \u00a0 \u00a0 as: \"user\"\r\n\u00a0 \u00a0 }\r\n\u00a0 },\r\n\u00a0 { $unwind: \"$user\" },\r\n\u00a0 { $project: { name: \"$user.name\", total: 1 } }\r\n]);\r\n<\/pre>\n<p>O SQL++ tamb\u00e9m oferece suporte a v\u00e1rias uni\u00f5es e uni\u00f5es em express\u00f5es - o <em>$lookup<\/em> \u00e9 mais limitado em compara\u00e7\u00e3o.<\/p>\n<h2 style=\"font-weight: 400;\">Suporte \u00e0 agrega\u00e7\u00e3o<\/h2>\n<p>O SQL++ tem fun\u00e7\u00f5es GROUP BY, HAVING, fun\u00e7\u00f5es de janela e express\u00f5es flex\u00edveis completas - exatamente como o SQL padr\u00e3o.<\/p>\n<p>Exemplo:<\/p>\n<pre>SELECT department, AVG(salary) AS avg_salary\r\nFROM employees\r\nGROUP BY department\r\nHAVING avg_salary &gt; 75000;\r\n<\/pre>\n<p>O pipeline de agrega\u00e7\u00e3o do Mongo \u00e9 capaz, mas mais processual. Voc\u00ea encadeia est\u00e1gios como <em>$group<\/em>, <em>$match<\/em>, <em>Projeto $<\/em>etc:<\/p>\n<pre>db.employees.aggregate([\r\n\u00a0 { $group: { _id: \"$department\", avg_salary: { $avg: \"$salary\" } } },\r\n\u00a0 { $match: { avg_salary: { $gt: 75000 } } }\r\n]);\r\n<\/pre>\n<p>Ambos s\u00e3o avan\u00e7ados, mas o SQL++ \u00e9 normalmente mais conciso e familiar para os usu\u00e1rios de SQL e oferece suporte a recursos como <a href=\"https:\/\/docs.couchbase.com\/cloud\/n1ql\/n1ql-language-reference\/windowfun.html\" target=\"_blank\" rel=\"noopener\">fun\u00e7\u00f5es da janela<\/a> que o pipeline do Mongo n\u00e3o possui.<\/p>\n<h2 style=\"font-weight: 400;\">Filtragem e l\u00f3gica de predicados<\/h2>\n<p>O SQL++ tem suporte total para filtragem complexa com <em>E<\/em>, <em>OU<\/em>, <em>N\u00c3O<\/em>, <em>ENTRE<\/em>, <em>IN<\/em>subconsultas e express\u00f5es arbitr\u00e1rias.<\/p>\n<p>Exemplo:<\/p>\n<pre>SELECT name\r\nFROM users\r\nWHERE (age BETWEEN 21 AND 65)\r\n\u00a0 AND (email LIKE \"%@example.com\")\r\n\u00a0 AND (status IN [\"active\", \"pending\"]);\r\n<\/pre>\n<p>O Mongo oferece suporte \u00e0 filtragem em <em>find()<\/em> e em <em>$match<\/em> mas a sintaxe \u00e9 mais detalhada e baseada em JSON:<\/p>\n<pre>db.users.find({\r\n\u00a0 age: { $gte: 21, $lte: 65 },\r\n\u00a0 email: { $regex: \"@example\\\\.com$\" },\r\n\u00a0 status: { $in: [\"active\", \"pending\"] }\r\n});\r\n<\/pre>\n<p>Ambos podem expressar predicados complexos, mas o SQL++ tende a ser mais leg\u00edvel para l\u00f3gica booleana altamente complexa.<\/p>\n<h2 style=\"font-weight: 400;\">Suporte a subconsultas<\/h2>\n<p>O SQL++ oferece suporte a subconsultas completas: correlacionadas, n\u00e3o correlacionadas e escalares, <em>EXISTE<\/em>\/<em>N\u00c3O EXISTE<\/em>-Todos os padr\u00f5es que voc\u00ea espera.<\/p>\n<p>Exemplo:<\/p>\n<pre>SELECT name\r\nFROM users u\r\nWHERE EXISTS (\r\n\u00a0 SELECT 1 FROM orders o\r\n\u00a0 WHERE o.user_id = u.id AND o.total &gt; 100\r\n);\r\n<\/pre>\n<p>O Mongo n\u00e3o oferece suporte a subconsultas da mesma forma. Geralmente, \u00e9 necess\u00e1rio reescrever usando <em>$lookup<\/em>, <em>$facet<\/em>ou v\u00e1rias consultas no c\u00f3digo do aplicativo. Essa \u00e9 uma \u00e1rea em que o SQL++ \u00e9 muito mais forte e mais natural.<\/p>\n<h2 style=\"font-weight: 400;\">Suporte \u00e0 manipula\u00e7\u00e3o de dados<\/h2>\n<p>O SQL++ oferece suporte a <em>INSERIR<\/em>, <em>ATUALIZA\u00c7\u00c3O<\/em>, <em>DELETE<\/em>, <em>MERGE<\/em> - todas as opera\u00e7\u00f5es padr\u00e3o de manipula\u00e7\u00e3o de dados.<\/p>\n<p>Exemplo <em>ATUALIZA\u00c7\u00c3O<\/em>:<\/p>\n<pre>UPDATE users\r\nSET status = \"inactive\"\r\nWHERE last_login &lt; \"2024-01-01\";\r\n<\/pre>\n<p>O Mongo tamb\u00e9m oferece suporte \u00e0 manipula\u00e7\u00e3o de dados por meio de <em>insertOne<\/em>, <em>insertMany<\/em>, <em>updateOne<\/em>, <em>updateMany<\/em>, <em>deleteOne<\/em>, <em>deleteMany<\/em>e <em>replaceOne<\/em>. A funcionalidade \u00e9 s\u00f3lida, mas as opera\u00e7\u00f5es s\u00e3o chamadas de API separadas, n\u00e3o unificadas em uma linguagem de consulta.<\/p>\n<p>Exemplo de atualiza\u00e7\u00e3o:<\/p>\n<pre>db.users.updateMany(\r\n\u00a0 { last_login: { $lt: new Date(\"2024-01-01\") } },\r\n\u00a0 { $set: { status: \"inactive\" } }\r\n);\r\n<\/pre>\n<p>Ambos s\u00e3o capazes, mas o SQL++ oferece uma linguagem \u00fanica e consistente para consulta e modifica\u00e7\u00e3o de dados.<\/p>\n<h2 style=\"font-weight: 400;\">Suporte a transa\u00e7\u00f5es<\/h2>\n<p>O SQL++ oferece suporte a transa\u00e7\u00f5es ACID de v\u00e1rias declara\u00e7\u00f5es (com o <em>INICIAR TRANSA\u00c7\u00c3O<\/em>, <em>COMPROMISSO<\/em>, <em>ROLLBACK<\/em>), e as transa\u00e7\u00f5es podem abranger v\u00e1rios documentos, cole\u00e7\u00f5es e at\u00e9 mesmo v\u00e1rios extratos.<\/p>\n<p>Exemplo:<\/p>\n<pre>BEGIN TRANSACTION;\r\nUPDATE accounts SET balance = balance - 100 WHERE id = \"user123\";\r\nUPDATE accounts SET balance = balance + 100 WHERE id = \"user456\";\r\nCOMMIT;\r\n<\/pre>\n<p>O Mongo introduziu transa\u00e7\u00f5es ACID de v\u00e1rios documentos na vers\u00e3o 4.0. Elas s\u00e3o suportadas, mas devem ser iniciadas a partir de drivers usando um objeto de sess\u00e3o, ou mongosh, que n\u00e3o faz parte da pr\u00f3pria linguagem de consulta do Mongo.<\/p>\n<p>Exemplo (baseado em driver no Node.js):<\/p>\n<pre>const session = client.startSession();\r\nsession.startTransaction();\r\ntry {\r\n\u00a0 db.accounts.updateOne({ id: \"user123\" }, { $inc: { balance: -100 } }, { session });\r\n\u00a0 db.accounts.updateOne({ id: \"user456\" }, { $inc: { balance: 100 } }, { session });\r\n\u00a0 await session.commitTransaction();\r\n} catch (error) {\r\n\u00a0 await session.abortTransaction();\r\n}\r\nsession.endSession();\r\n<\/pre>\n<p>Resumo: ambos oferecem suporte a transa\u00e7\u00f5es ACID, mas o SQL++ permite que voc\u00ea as expresse de forma declarativa dentro da pr\u00f3pria linguagem de consulta, o que \u00e9 mais f\u00e1cil e mais claro.<\/p>\n<h2 style=\"font-weight: 400;\">Tratamento de erros<\/h2>\n<p>O SQL++ apresenta c\u00f3digos de erro estruturados e mensagens para o cliente quando uma consulta falha - eles podem ser acessados por meio dos SDKs e dos metadados da consulta. Voc\u00ea tamb\u00e9m pode escrever consultas de forma defensiva (por exemplo, IF EXISTS, IF MISSING, express\u00f5es CASE) para controlar o comportamento.<\/p>\n<p>Exemplo (l\u00f3gica defensiva):<\/p>\n<pre>UPDATE users\r\nSET last_login = CURRENT_TIMESTAMP\r\nWHERE user_id = \"user123\"\r\nAND last_login IS NOT MISSING;\r\n<\/pre>\n<p>Os c\u00f3digos de erro est\u00e3o documentados aqui: <a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/n1ql-error-codes.html\" target=\"_blank\" rel=\"noopener\">C\u00f3digos de erro do Couchbase SQL++<\/a>.<\/p>\n<p>O Mongo tamb\u00e9m se baseia no tratamento de erros em n\u00edvel de driver - os erros s\u00e3o enviados ao cliente quando as consultas ou os comandos falham. O pipeline de agrega\u00e7\u00e3o do Mongo tamb\u00e9m n\u00e3o oferece suporte ao tratamento de erros na consulta.<\/p>\n<p>Exemplo (atualiza\u00e7\u00e3o defensiva do Mongo):<\/p>\n<pre>db.users.updateOne(\r\n\u00a0 { user_id: \"user123\", last_login: { $exists: true } },\r\n\u00a0 { $set: { last_login: new Date() } }\r\n);\r\n<\/pre>\n<p>Resumo: tanto o SQL++ quanto o Mongo dependem do tratamento de erros externos (em n\u00edvel de driver). Voc\u00ea pode usar padr\u00f5es de consulta defensivos para atenuar erros comuns.<\/p>\n<h2 style=\"font-weight: 400;\">Extensibilidade<\/h2>\n<p>O SQL++ permite fun\u00e7\u00f5es definidas pelo usu\u00e1rio (UDFs) escritas no pr\u00f3prio SQL++. Elas podem encapsular l\u00f3gicas complexas, reutilizar express\u00f5es e simplificar as consultas.<\/p>\n<p>Exemplo de UDF:<\/p>\n<pre>CREATE FUNCTION get_discount(total FLOAT)\r\nRETURNS FLOAT\r\nAS\r\n\u00a0 CASE WHEN total &gt; 500 THEN 0.10\r\n \u00a0 \u00a0 \u00a0 WHEN total &gt; 100 THEN 0.05\r\n \u00a0 \u00a0 \u00a0 ELSE 0.0\r\n\u00a0 END;\r\n<\/pre>\n<p>Uso:<\/p>\n<pre>SELECT customer_id, total, get_discount(total) AS discount\r\nFROM orders;\r\n<\/pre>\n<p>O Mongo n\u00e3o tem UDFs de consulta em sua linguagem de consulta ou pipeline de agrega\u00e7\u00e3o. Voc\u00ea pode usar <em>$fun\u00e7\u00e3o<\/em> (introduzido no MongoDB 4.4), que permite que voc\u00ea execute fun\u00e7\u00f5es JavaScript dentro da agrega\u00e7\u00e3o, mas isso \u00e9 menos eficiente e limitado em termos de portabilidade:<\/p>\n<pre>db.orders.aggregate([\r\n\u00a0 {\r\n\u00a0 \u00a0 $addFields: {\r\n\u00a0 \u00a0 \u00a0 discount: {\r\n\u00a0 \u00a0 \u00a0 \u00a0 $function: {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 body: function(total) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (total &gt; 500) return 0.10;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (total &gt; 100) return 0.05;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return 0.0;\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 },\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 args: [\"$total\"],\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 lang: \"js\"\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 }\r\n\u00a0 }\r\n]);\r\n<\/pre>\n<p>Resumo: os UDFs do SQL++ s\u00e3o nativos, eficientes e port\u00e1teis; os UDFs do Mongo <em>$fun\u00e7\u00e3o<\/em> usa JavaScript e pode ter desvantagens de desempenho.<\/p>\n<h2 style=\"font-weight: 400;\">Natureza declarativa<\/h2>\n<p>O SQL++ \u00e9 totalmente declarativo - voc\u00ea expressa o que deseja, n\u00e3o como calcular. Voc\u00ea conta com o otimizador de consultas para determinar o melhor plano de execu\u00e7\u00e3o. Isso torna as consultas mais simples de escrever e manter.<\/p>\n<p>O pipeline de agrega\u00e7\u00e3o do Mongo \u00e9 mais processual - voc\u00ea especifica a sequ\u00eancia exata de opera\u00e7\u00f5es (<em>$match<\/em>, <em>$group<\/em>, <em>Projeto $<\/em>, <em>$sort<\/em>etc.). No caso de l\u00f3gica complexa, isso geralmente requer pensar em termos de fluxo de dados, n\u00e3o de resultado desejado.<\/p>\n<h2 style=\"font-weight: 400;\">Portabilidade<\/h2>\n<p>O SQL++ \u00e9 baseado em SQL com extens\u00f5es JSON. Se voc\u00ea conhece SQL, \u00e9 f\u00e1cil aprender SQL++, e grande parte do seu conhecimento \u00e9 transferido. A linguagem tamb\u00e9m foi projetada para ser port\u00e1vel em todas as implanta\u00e7\u00f5es do Couchbase - nuvem, autogerenciada, borda.<\/p>\n<p>A linguagem de consulta do Mongo \u00e9 espec\u00edfica do MongoDB. Sua sintaxe \u00e9 baseada em JSON, n\u00e3o em SQL, e a maior parte dela n\u00e3o \u00e9 transferida para outros bancos de dados. Embora seja \u00f3tima dentro do ecossistema Mongo, \u00e9 mais dif\u00edcil de ser transferida para sistemas como bancos de dados relacionais, Couchbase ou data warehouses em nuvem.<\/p>\n<h2 style=\"font-weight: 400;\">Suporte \u00e0 pagina\u00e7\u00e3o<\/h2>\n<p>O SQL++ oferece suporte \u00e0 pagina\u00e7\u00e3o usando <em>LIMITE<\/em> e <em>DESLOCAMENTO<\/em> - estilo SQL padr\u00e3o:<\/p>\n<pre>SELECT name\r\nFROM users\r\nORDER BY name\r\nLIMIT 10 OFFSET 20;\r\n<\/pre>\n<p>O Mongo tamb\u00e9m oferece suporte \u00e0 pagina\u00e7\u00e3o com <em>.limit()<\/em> e <em>.skip()<\/em>:<\/p>\n<pre>db.users.find({})\r\n\u00a0 .sort({ name: 1 })\r\n\u00a0 .skip(20)\r\n\u00a0 .limit(10);\r\n<\/pre>\n<p>Ambos lidam bem com a pagina\u00e7\u00e3o b\u00e1sica.<\/p>\n<p>No entanto, o SQL++ tamb\u00e9m oferece suporte a fun\u00e7\u00f5es de janela (por exemplo <em>ROW_NUMBER() OVER (...)<\/em>), que permite padr\u00f5es mais avan\u00e7ados de pagina\u00e7\u00e3o e baseados em cursor, enquanto o Mongo requer est\u00e1gios adicionais de pipeline ou l\u00f3gica de aplicativo para simul\u00e1-los.<\/p>\n<h2 style=\"font-weight: 400;\">Introspec\u00e7\u00e3o de esquema<\/h2>\n<p>O SQL++ \/ Couchbase oferece suporte \u00e0 descoberta autom\u00e1tica de esquemas por meio do <em>INFER<\/em> comando. Como o Couchbase \u00e9 flex\u00edvel em termos de esquema, <em>INFER<\/em> permite analisar documentos em uma cole\u00e7\u00e3o e gerar um esquema probabil\u00edstico, mostrando quais campos existem, seus tipos, aninhamento e porcentagens de ocorr\u00eancia.<\/p>\n<p>Exemplo:<\/p>\n<pre>INFER `travel-sample`.inventory.airline WITH { \"sample_size\": 1000 };\r\n<\/pre>\n<p>Retorna informa\u00e7\u00f5es sobre a cole\u00e7\u00e3o de linhas a\u00e9reas, incluindo nomes de campos, tipos e porcentagens de ocorr\u00eancia:<\/p>\n<pre>[\r\n\u00a0 [\r\n\u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \"#docs\": 187,\r\n\u00a0 \u00a0 \u00a0 \"$schema\": \"https:\/\/json-schema.org\/draft-06\/schema\",\r\n\u00a0 \u00a0 \u00a0 \"Flavor\": \"`type` = \\\"airline\\\"\",\r\n\u00a0 \u00a0 \u00a0 \"properties\": {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \"callsign\": { ... }, \"country\": { ... }, \"name\": { ... }, ...\r\n\u00a0 \u00a0 \u00a0 },\r\n\u00a0 \u00a0 \u00a0 \"type\": \"object\"\r\n\u00a0 \u00a0 }\r\n\u00a0 ]\r\n]\r\n<\/pre>\n<p>O Mongo n\u00e3o tem uma linguagem de consulta direta equivalente a <em>INFER<\/em>embora o MongoDB Atlas ofere\u00e7a o Schema Explorer na interface do usu\u00e1rio.<\/p>\n<p>Op\u00e7\u00f5es mais pr\u00f3ximas:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><em>db.collection.aggregate([ { $sample: { size: N } } ]) + inspe\u00e7\u00e3o manual<\/em><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Ferramentas de terceiros<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2 style=\"font-weight: 400;\">Suporte a ferramentas e IDE<\/h2>\n<p>O SQL++ \u00e9 compat\u00edvel com:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Workbench de consulta da interface do usu\u00e1rio da Web do Couchbase<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Extens\u00e3o SQL++ do VS Code<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">IDEs da JetBrains (plug-in)<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">API REST \/ CLI<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Shell do Couchbase<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>As ferramentas do Mongo incluem:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">MongoDB Compass (GUI)<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Mongo Shell \/ mongosh<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">IU do MongoDB Atlas<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">C\u00f3digo VS Extens\u00e3o do MongoDB<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>H\u00e1 outras ferramentas tamb\u00e9m. Ambos t\u00eam boas ferramentas. O SQL++ se integra melhor com ferramentas compat\u00edveis com SQL (DataGrip, ferramentas de BI, etc.). As ferramentas do Mongo s\u00e3o mais espec\u00edficas para o Mongo.<\/p>\n<h2 style=\"font-weight: 400;\">Comunidade e documenta\u00e7\u00e3o<\/h2>\n<p>SQL++ \/ Couchbase:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Documentos oficiais: <a href=\"https:\/\/docs.couchbase.com\/server\/current\/n1ql\/n1ql-language-reference\/index.html\" target=\"_blank\" rel=\"noopener\">Refer\u00eancia do Couchbase SQL++<\/a><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Comunidade ativa de desenvolvedores do Couchbase<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Blogs, f\u00f3runs, Stack Overflow, Discord<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">O SQL++ \u00e9 baseado no SQL conhecido, portanto, os recursos SQL existentes tamb\u00e9m se aplicam<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Mongo:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Documentos oficiais: Refer\u00eancia da linguagem de consulta do MongoDB<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Grande comunidade<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Muitos tutoriais, cursos e livros<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Muito usado em comunidades de desenvolvimento web \/ JavaScript<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>O Mongo tem uma comunidade maior (simplesmente devido \u00e0 ado\u00e7\u00e3o mais ampla), mas o SQL++ se beneficia da familiaridade com o SQL e de um ecossistema de desenvolvedores do Couchbase cada vez mais ativo.<\/p>\n<h2 style=\"font-weight: 400;\">Integra\u00e7\u00e3o com estruturas de aplicativos<\/h2>\n<p>O SQL++ \/ Couchbase \u00e9 suportado via:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">SDKs nas principais linguagens: Java, .NET (C#), Node.js, Python, Go, C++, Scala<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Drivers ODBC \/ JDBC \u2192 funciona com ferramentas de BI (Tableau, Power BI, Excel, Looker)<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">API REST<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Um ecossistema crescente de <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/developers\/integrations\/\" target=\"_blank\" rel=\"noopener\">integra\u00e7\u00f5es<\/a>incluindo Spring Data, EF Core, Quarkus e muito mais<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>O Mongo tem:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Drivers oficiais para quase todos os principais idiomas<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Ecossistema s\u00f3lido para desenvolvedores<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>O Mongo tem um ecossistema maior, mas o SQL++ \u00e9 mais familiar para os desenvolvedores de SQL em geral.<\/p>\n<h2 style=\"font-weight: 400;\">Conformidade com os padr\u00f5es<\/h2>\n<p>O SQL++ \u00e9 uma linguagem derivada do SQL:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Baseado em ANSI SQL com extens\u00f5es para documentos JSON, matrizes, aninhamento<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Voc\u00ea pode usar as habilidades padr\u00e3o de SQL e us\u00e1-las imediatamente<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Muitas ferramentas e padr\u00f5es baseados em SQL existentes se aplicam<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>A linguagem de consulta do Mongo n\u00e3o \u00e9 padr\u00e3o:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Com base na sintaxe e nos operadores JSON<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Nenhum mapeamento direto para ANSI SQL<\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\">Requer o aprendizado de padr\u00f5es de consulta espec\u00edficos do Mongo<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Se voc\u00ea quiser compatibilidade com SQL e alinhamento de padr\u00f5es, procure o SQL++. Se voc\u00ea n\u00e3o tiver problemas com uma linguagem espec\u00edfica do Mongo, a abordagem do Mongo funciona, mas \u00e9 mais dif\u00edcil de portar.<\/p>\n<hr \/>\n<h2 style=\"font-weight: 400;\">Resumo<\/h2>\n<p>O SQL++ \u00e9 uma op\u00e7\u00e3o natural para desenvolvedores familiarizados com SQL. \u00c9 um superconjunto do SQL, portanto, o conhecimento existente sobre SQL \u00e9 transferido.<\/p>\n<p>A linguagem de consulta do MongoDB \u00e9 mais especializada e processual, o que pode ser poderoso, mas tamb\u00e9m exige uma mentalidade diferente.<\/p>\n<p>Aqui est\u00e1 a lista completa de crit\u00e9rios:<\/p>\n<table>\n<tbody>\n<tr>\n<td><strong>Classifica\u00e7\u00e3o<\/strong><\/td>\n<td><strong>Nome do crit\u00e9rio<\/strong><\/td>\n<td><strong>Como aplicar<\/strong><\/td>\n<td><strong>Por que \u00e9 importante<\/strong><\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>Expressividade<\/td>\n<td>Avaliar quantos tipos de consultas podem ser escritos<\/td>\n<td>Determina a flexibilidade no tratamento de tarefas de dados<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>Legibilidade<\/td>\n<td>Revisar exemplos de consultas para maior clareza<\/td>\n<td>Impacta a curva de aprendizado e a manuten\u00e7\u00e3o<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>Consist\u00eancia<\/td>\n<td>Procure sintaxe e sem\u00e2ntica consistentes<\/td>\n<td>Reduz bugs e surpresas<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>Desempenho<\/td>\n<td>Execu\u00e7\u00e3o de consultas de benchmark em cargas de trabalho reais<\/td>\n<td>Afeta a velocidade e a escalabilidade<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>Suporte a \u00edndices<\/td>\n<td>Verificar a variedade de tipos de \u00edndices e op\u00e7\u00f5es de uso<\/td>\n<td>Essencial para otimizar a velocidade de consulta<\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td>Recursos de uni\u00e3o<\/td>\n<td>Suporte de teste para diferentes tipos de uni\u00e3o<\/td>\n<td>Chave para trabalhar com dados relacionados<\/td>\n<\/tr>\n<tr>\n<td>7<\/td>\n<td>Suporte \u00e0 agrega\u00e7\u00e3o<\/td>\n<td>Avaliar o suporte para agrupamento e agrega\u00e7\u00e3o<\/td>\n<td>Necess\u00e1rio para an\u00e1lises e relat\u00f3rios<\/td>\n<\/tr>\n<tr>\n<td>8<\/td>\n<td>Filtragem e l\u00f3gica de predicados<\/td>\n<td>Testar cl\u00e1usulas WHERE e HAVING complexas<\/td>\n<td>Permite a recupera\u00e7\u00e3o precisa de dados<\/td>\n<\/tr>\n<tr>\n<td>9<\/td>\n<td>Suporte a subconsultas<\/td>\n<td>Verificar o suporte a subconsultas correlacionadas e aninhadas<\/td>\n<td>Adiciona profundidade \u00e0 consulta<\/td>\n<\/tr>\n<tr>\n<td>10<\/td>\n<td>Suporte \u00e0 manipula\u00e7\u00e3o de dados<\/td>\n<td>Teste a funcionalidade INSERT, UPDATE, DELETE e MERGE<\/td>\n<td>Importante para a manuten\u00e7\u00e3o de dados<\/td>\n<\/tr>\n<tr>\n<td>11<\/td>\n<td>Suporte a transa\u00e7\u00f5es<\/td>\n<td>Suporte de verifica\u00e7\u00e3o para transa\u00e7\u00f5es com v\u00e1rios extratos<\/td>\n<td>Garante a consist\u00eancia e a atomicidade dos dados<\/td>\n<\/tr>\n<tr>\n<td>12<\/td>\n<td>Tratamento de erros<\/td>\n<td>Revisar os mecanismos de detec\u00e7\u00e3o e comunica\u00e7\u00e3o de erros<\/td>\n<td>Ajuda na depura\u00e7\u00e3o e na confiabilidade<\/td>\n<\/tr>\n<tr>\n<td>13<\/td>\n<td>Extensibilidade<\/td>\n<td>Verificar a capacidade de adicionar fun\u00e7\u00f5es definidas pelo usu\u00e1rio (UDFs)<\/td>\n<td>Permite a personaliza\u00e7\u00e3o para necessidades avan\u00e7adas<\/td>\n<\/tr>\n<tr>\n<td>14<\/td>\n<td>Natureza declarativa<\/td>\n<td>Determinar se o idioma especifica <b>o que<\/b> para fazer, n\u00e3o <b>como<\/b><\/td>\n<td>Simplifica o desenvolvimento e a otimiza\u00e7\u00e3o<\/td>\n<\/tr>\n<tr>\n<td>15<\/td>\n<td>Portabilidade<\/td>\n<td>Veja como as consultas migram facilmente entre sistemas<\/td>\n<td>Reduz a depend\u00eancia de fornecedores e ajuda na flexibilidade<\/td>\n<\/tr>\n<tr>\n<td>16<\/td>\n<td>Suporte \u00e0 pagina\u00e7\u00e3o<\/td>\n<td>Teste o suporte a LIMIT, OFFSET ou janelamento<\/td>\n<td>Cr\u00edtico para APIs e acesso a dados orientado pela interface do usu\u00e1rio<\/td>\n<\/tr>\n<tr>\n<td>17<\/td>\n<td>Introspec\u00e7\u00e3o de esquema<\/td>\n<td>Verificar a consulta de metadados de esquema\/cat\u00e1logo<\/td>\n<td>Suporta automa\u00e7\u00e3o e ferramentas<\/td>\n<\/tr>\n<tr>\n<td>18<\/td>\n<td>Suporte a ferramentas e IDE<\/td>\n<td>Pesquisar o ecossistema de editores de consultas, plug-ins etc.<\/td>\n<td>Impacta a produtividade do desenvolvedor<\/td>\n<\/tr>\n<tr>\n<td>19<\/td>\n<td>Comunidade e documenta\u00e7\u00e3o<\/td>\n<td>Revisar a qualidade dos documentos, f\u00f3runs da comunidade e tutoriais<\/td>\n<td>Afeta a facilidade de aprendizado e solu\u00e7\u00e3o de problemas<\/td>\n<\/tr>\n<tr>\n<td>20<\/td>\n<td>Integra\u00e7\u00e3o com estruturas de aplicativos<\/td>\n<td>Verifique o suporte a bibliotecas e drivers em idiomas populares<\/td>\n<td>Facilita o desenvolvimento de aplicativos<\/td>\n<\/tr>\n<tr>\n<td>21<\/td>\n<td>Conformidade com os padr\u00f5es<\/td>\n<td>Comparar com os padr\u00f5es do setor (por exemplo, SQL)<\/td>\n<td>Ajuda na portabilidade e interoperabilidade<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>When you\u2019re building apps, the query language you work with makes a big difference. It affects everything from performance to how quickly your team can ship features. In this post, I\u2019ve asked an LLM to create a list of 21 [&hellip;]<\/p>","protected":false},"author":71,"featured_media":17371,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1812],"tags":[9639],"ppma_author":[8937],"class_list":["post-17369","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-n1ql-query","tag-mongodb-query"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Choosing the Right Query Language: SQL++ vs. Mongo - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Show how SQL++, used by Couchbase, and Mongo\u2019s Query API (previously known as MQL) languages stack up on the most popular types of query capabilities.\" \/>\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\/choosing-the-right-query-language-sql-vs-mongo\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Choosing the Right Query Language: SQL++ vs. Mongo\" \/>\n<meta property=\"og:description\" content=\"Show how SQL++, used by Couchbase, and Mongo\u2019s Query API (previously known as MQL) languages stack up on the most popular types of query capabilities.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/choosing-the-right-query-language-sql-vs-mongo\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-25T17:09:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-13T13:52:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-sql-vs-mongo-mql.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1256\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Matthew Groves\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mgroves\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthew Groves\" \/>\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\/choosing-the-right-query-language-sql-vs-mongo\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"Choosing the Right Query Language: SQL++ vs. Mongo\",\"datePublished\":\"2025-07-25T17:09:07+00:00\",\"dateModified\":\"2025-08-13T13:52:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/\"},\"wordCount\":2040,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-sql-vs-mongo-mql.png\",\"keywords\":[\"mongodb query\"],\"articleSection\":[\"Application Design\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/\",\"name\":\"Choosing the Right Query Language: SQL++ vs. Mongo - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-sql-vs-mongo-mql.png\",\"datePublished\":\"2025-07-25T17:09:07+00:00\",\"dateModified\":\"2025-08-13T13:52:59+00:00\",\"description\":\"Show how SQL++, used by Couchbase, and Mongo\u2019s Query API (previously known as MQL) languages stack up on the most popular types of query capabilities.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-sql-vs-mongo-mql.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-sql-vs-mongo-mql.png\",\"width\":2400,\"height\":1256},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Choosing the Right Query Language: SQL++ vs. Mongo\"}]},{\"@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\/3929663e372020321b0152dc4fa65a58\",\"name\":\"Matthew Groves\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"caption\":\"Matthew Groves\"},\"description\":\"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.\",\"sameAs\":[\"https:\/\/crosscuttingconcerns.com\",\"https:\/\/x.com\/mgroves\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/matthew-groves\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Choosing the Right Query Language: SQL++ vs. Mongo - The Couchbase Blog","description":"Show how SQL++, used by Couchbase, and Mongo\u2019s Query API (previously known as MQL) languages stack up on the most popular types of query capabilities.","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\/choosing-the-right-query-language-sql-vs-mongo\/","og_locale":"pt_BR","og_type":"article","og_title":"Choosing the Right Query Language: SQL++ vs. Mongo","og_description":"Show how SQL++, used by Couchbase, and Mongo\u2019s Query API (previously known as MQL) languages stack up on the most popular types of query capabilities.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/choosing-the-right-query-language-sql-vs-mongo\/","og_site_name":"The Couchbase Blog","article_published_time":"2025-07-25T17:09:07+00:00","article_modified_time":"2025-08-13T13:52:59+00:00","og_image":[{"width":2400,"height":1256,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-sql-vs-mongo-mql.png","type":"image\/png"}],"author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"Choosing the Right Query Language: SQL++ vs. Mongo","datePublished":"2025-07-25T17:09:07+00:00","dateModified":"2025-08-13T13:52:59+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/"},"wordCount":2040,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-sql-vs-mongo-mql.png","keywords":["mongodb query"],"articleSection":["Application Design","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/","url":"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/","name":"Choosing the Right Query Language: SQL++ vs. Mongo - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-sql-vs-mongo-mql.png","datePublished":"2025-07-25T17:09:07+00:00","dateModified":"2025-08-13T13:52:59+00:00","description":"Show how SQL++, used by Couchbase, and Mongo\u2019s Query API (previously known as MQL) languages stack up on the most popular types of query capabilities.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-sql-vs-mongo-mql.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/07\/blog-sql-vs-mongo-mql.png","width":2400,"height":1256},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/choosing-the-right-query-language-sql-vs-mongo\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Choosing the Right Query Language: SQL++ vs. Mongo"}]},{"@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\/3929663e372020321b0152dc4fa65a58","name":"Matthew Groves","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54","url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","caption":"Matthew Groves"},"description":"Matthew D. Groves \u00e9 um cara que adora programar. N\u00e3o importa se \u00e9 C#, jQuery ou PHP: ele enviar\u00e1 solicita\u00e7\u00f5es de pull para qualquer coisa. Ele tem programado profissionalmente desde que escreveu um aplicativo de ponto de venda QuickBASIC para a pizzaria de seus pais nos anos 90. Atualmente, ele trabalha como gerente s\u00eanior de marketing de produtos da Couchbase. Seu tempo livre \u00e9 passado com a fam\u00edlia, assistindo aos Reds e participando da comunidade de desenvolvedores. Ele \u00e9 autor de AOP in .NET, Pro Microservices in .NET, autor da Pluralsight e Microsoft MVP.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/matthew-groves\/"}]}},"authors":[{"term_id":8937,"user_id":71,"is_guest":0,"slug":"matthew-groves","display_name":"Matthew Groves","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","first_name":"Matthew","last_name":"Groves","user_url":"https:\/\/crosscuttingconcerns.com","author_category":"","description":"Matthew D. Groves \u00e9 um cara que adora programar.  N\u00e3o importa se \u00e9 C#, jQuery ou PHP: ele enviar\u00e1 solicita\u00e7\u00f5es de pull para qualquer coisa.  Ele tem programado profissionalmente desde que escreveu um aplicativo de ponto de venda QuickBASIC para a pizzaria de seus pais nos anos 90.  Atualmente, ele trabalha como gerente s\u00eanior de marketing de produtos da Couchbase. Seu tempo livre \u00e9 passado com a fam\u00edlia, assistindo aos Reds e participando da comunidade de desenvolvedores.  Ele \u00e9 autor de AOP in .NET, Pro Microservices in .NET, autor da Pluralsight e Microsoft MVP."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/17369","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\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=17369"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/17369\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/17371"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=17369"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=17369"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=17369"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=17369"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}