{"id":53030,"date":"2022-09-19T05:38:20","date_gmt":"2022-09-19T08:38:20","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=53030&#038;preview=true&#038;preview_id=53030"},"modified":"2025-01-17T10:52:08","modified_gmt":"2025-01-17T13:52:08","slug":"operadores-mongodb","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/","title":{"rendered":"9 Tipos de Operadores Mongodb que Voc\u00ea Precisa Conhecer"},"content":{"rendered":"<p>Em qualquer neg\u00f3cio, os dados s\u00e3o o seu maior ativo. Ao analisar os dados, voc\u00ea pode tomar decis\u00f5es sobre as tend\u00eancias do cliente e a previs\u00e3o de comportamento. Isto aumenta a lucratividade do neg\u00f3cio e a tomada de decis\u00f5es efetiva.<\/p>\n<p>Sem <a href=\"https:\/\/kinsta.com\/pt\/blog\/banco-de-dados-de-codigo-aberto\/\">um software de banco de dados<\/a>, uma tarefa simples como encontrar a m\u00e9dia de todos os valores em um sistema cheio de registros seria entediante. Felizmente, as bases de dados tornaram a an\u00e1lise de dados mais f\u00e1cil e r\u00e1pida com fun\u00e7\u00f5es e operadores.<\/p>\n\n<p>Este artigo ir\u00e1 lan\u00e7ar alguma luz sobre os operadores utilizados no software de banco de dados MongoDB.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>O que s\u00e3o os operadores MongoDB?<\/h2>\n<p>O <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-mongodb\/\">MongoDB<\/a> \u00e9 um software de banco de dados NoSQL que gerencia informa\u00e7\u00f5es orientadas a documentos.<\/p>\n<p>Uma das principais caracter\u00edsticas do MongoDB \u00e9 sua velocidade. Para retornar consultas mais rapidamente, a MongoDB pode usar operadores para executar fun\u00e7\u00f5es espec\u00edficas.<\/p>\n<p>Os operadores s\u00e3o s\u00edmbolos especiais que ajudam os compiladores a realizar tarefas matem\u00e1ticas ou l\u00f3gicas. O MongoDB oferece v\u00e1rios tipos de operadores para interagir com o banco de dados.<\/p>\n<h2>Tipos de operadores MongoDB<\/h2>\n<p>Existem nove tipos de operadores, cada um nomeado por sua fun\u00e7\u00e3o. Por exemplo, os operadores l\u00f3gicos usam opera\u00e7\u00f5es l\u00f3gicas. Para execut\u00e1-las, voc\u00ea precisa usar uma palavra-chave espec\u00edfica e seguir a sintaxe. Entretanto, eles s\u00e3o bastante f\u00e1ceis de seguir!<\/p>\n<p>Ao final do artigo, voc\u00ea ser\u00e1 capaz de aprender o b\u00e1sico de cada operador e suas fun\u00e7\u00f5es.<\/p>\n<h3>Operadores l\u00f3gicos<\/h3>\n<p>Operadores l\u00f3gicos s\u00e3o frequentemente usados para filtrar dados com base nas condi\u00e7\u00f5es dadas. Eles tamb\u00e9m permitem a avalia\u00e7\u00e3o de muitas condi\u00e7\u00f5es, que discutiremos em mais detalhes.<\/p>\n<p>Abaixo est\u00e3o alguns poucos operadores l\u00f3gicos que voc\u00ea pode usar:<\/p>\n<h4>$and<\/h4>\n<p>Uma condi\u00e7\u00e3o &#8220;and&#8221; realiza uma opera\u00e7\u00e3o l\u00f3gica &#8220;e&#8221; em uma matriz de duas ou mais express\u00f5es. Ela seleciona os documentos onde <em>todas <\/em>as condi\u00e7\u00f5es das express\u00f5es s\u00e3o satisfeitas.<\/p>\n<p>Esta \u00e9 a sintaxe padr\u00e3o para a express\u00e3o <code>$and<\/code>:<\/p>\n<pre><code class=\"language-php\">{ $and: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ... , { &lt;expressionN&gt; } ] }<\/code><\/pre>\n<pre><code class=\"language-php\">db.inventory.find( { $and: [ { quantity: { $lt: 15 } }, { price: 10 } ] } )<\/code><\/pre>\n<h4>$or<\/h4>\n<p>Uma condi\u00e7\u00e3o &#8220;or&#8221; realiza uma opera\u00e7\u00e3o l\u00f3gica &#8220;ou&#8221; em uma matriz de duas ou mais express\u00f5es. Ela seleciona os documentos onde pelo menos uma das express\u00f5es \u00e9 verdadeira.<\/p>\n<p>Esta \u00e9 a sintaxe padr\u00e3o para a express\u00e3o <code>$or<\/code>:<\/p>\n<pre><code class=\"language-php\">{ $or: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ... , { &lt;expressionN&gt; } ] }.<\/code><\/pre>\n<p>Por exemplo, se quisermos selecionar documentos onde o pre\u00e7o \u00e9 $10 ou a quantidade \u00e9 inferior a 15, podemos inserir a seguinte consulta:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $or: [ { quantity: { $lt: 15 } }, { price: 10 } ] } )<\/code><\/pre>\n<p>N\u00f3s n\u00e3o temos que limitar a express\u00e3o a dois crit\u00e9rios &#8211; podemos acrescentar mais. Por exemplo, a consulta abaixo seleciona aqueles documentos onde o pre\u00e7o \u00e9 igual a $10, a quantidade \u00e9 inferior a 15, ou a etiqueta \u00e9 estacion\u00e1ria:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $or: [ { quantity: { $lt: 15 } }, { price: 10 }, { tag: \"stationary\" }] } )<\/code><\/pre>\n<p>Ao executar estas cl\u00e1usulas, o MongoDB realiza uma varredura de cole\u00e7\u00e3o ou uma varredura de \u00edndice. Caso todos os \u00edndices suportam as cl\u00e1usulas, ent\u00e3o MongoDB usa \u00edndices para verificar uma express\u00e3o <code>$or<\/code>. Caso contr\u00e1rio, ele usa uma verifica\u00e7\u00e3o de cole\u00e7\u00e3o em seu lugar.<\/p>\n<p>Mas se voc\u00ea quiser testar os crit\u00e9rios no mesmo campo, voc\u00ea pode querer usar o operador <code>$in<\/code> ao inv\u00e9s do operador <code>$or<\/code>. Por exemplo, se voc\u00ea quiser uma cole\u00e7\u00e3o de documentos onde a quantidade seja 10 ou 20, voc\u00ea pode ter que executar a consulta abaixo <code>$in<\/code> em vez disso:<\/p>\n<pre><code class=\"language-php\">db.inventory.find ( { quantity: { $in: [20, 50] } } )<\/code><\/pre>\n<p>Cobriremos mais sobre o operador <code>$in<\/code> mais tarde.<\/p>\n<h4>$nor<\/h4>\n<p>Este operador realiza uma opera\u00e7\u00e3o l\u00f3gica &#8220;nor&#8221; em uma matriz usando uma ou mais express\u00f5es. Em seguida, ele seleciona os documentos que falham nas express\u00f5es de consulta. Em termos mais simples, ele faz o oposto da condi\u00e7\u00e3o <code>$or<\/code>.<\/p>\n<p>Esta \u00e9 a sintaxe geral:<\/p>\n<pre><code class=\"language-php\">{ $nor: [ { &lt;expression1&gt; }, { &lt;expression2&gt; }, ...  { &lt;expressionN&gt; } ] }<\/code><\/pre>\n<p>Vamos considerar a seguinte pergunta:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { $nor: [ { price: 3.99 }, { sale: true } ]  } )<\/code><\/pre>\n<p>Esta consulta seleciona os documentos que cont\u00eam:<\/p>\n<ul>\n<li>um valor de campo de pre\u00e7o n\u00e3o igual a $3,99, e um valor de venda n\u00e3o igual a verdadeiro; ou<\/li>\n<li>um valor de campo de pre\u00e7o n\u00e3o igual a $3,99, e um campo de venda vazio ou ausente; ou<\/li>\n<li>sem campo de pre\u00e7o, e um campo de venda n\u00e3o igual a verdadeiro; ou<\/li>\n<li>nem campo de pre\u00e7os, nem campo de vendas povoado ou presente.<\/li>\n<\/ul>\n<h4>$not<\/h4>\n<p>Este operador realiza uma opera\u00e7\u00e3o l\u00f3gica &#8220;not&#8221; em uma matriz para a express\u00e3o especificada. Ele ent\u00e3o seleciona os documentos que n\u00e3o combinam com as express\u00f5es de consulta. Isto inclui os documentos que n\u00e3o cont\u00eam o campo.<\/p>\n<p>Esta \u00e9 a sintaxe geral:<\/p>\n<pre><code class=\"language-php\">{ field: { $not: { &lt;operator-expression&gt; } } }<\/code><\/pre>\n<p>Por exemplo, pegue a seguinte pergunta:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { price: { $not: { $lt: 3.99 } } } )<\/code><\/pre>\n<p>Esta consulta selecionaria os documentos que cont\u00eam:<\/p>\n<ul>\n<li>um campo de pre\u00e7o cujo valor seja maior ou igual a $3,99; e<\/li>\n<li>um campo de pre\u00e7os \u00e9 despovoado ou n\u00e3o existe.<\/li>\n<\/ul>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p><code>{ $not: { $lt: 3.99 } }<\/code> difere do operador <code>$gte<\/code>. <code>{ $gte: 3.99 }<\/code> retorna apenas os documentos onde o campo de pre\u00e7o existe e seu valor \u00e9 maior ou igual a $3,99 (o operador <code>$not<\/code> retorna at\u00e9 mesmo aqueles documentos onde o campo de pre\u00e7o n\u00e3o existe).<\/p>\n<\/aside>\n\n<h3>Operadores de compara\u00e7\u00e3o<\/h3>\n<p>Os operadores de compara\u00e7\u00e3o podem ser usados para comparar valores em um ou mais documentos.<\/p>\n<p>Abaixo est\u00e1 uma amostra de c\u00f3digo de uma simples coleta de estoque para uma loja de supermercado:<\/p>\n<pre><code class=\"language-php\">{ _id: 1, item: { name: \"apple\", code: \"123\" }, qty: 15, tags: [ \"A\", \"B\", \"C\" ] },\n{ _id: 2, item: { name: \"banana\", code: \"123\" }, qty: 20, tags: [ \"B\" ] },\n{ _id: 3, item: { name: \"spinach\", code: \"456\" }, qty: 25, tags: [ \"A\", \"B\" ] },\n{ _id: 4, item: { name: \"lentils\", code: \"456\" }, qty: 30, tags: [ \"B\", \"A\" ] },\n{ _id: 5, item: { name: \"pears\", code: \"000\" }, qty: 20, tags: [ [ \"A\", \"B\" ], \"C\" ] },\n{ _id: 6, item: { name: \"strawberry\", code: \"123\" }, tags: [ \"B\" ] }<\/code><\/pre>\n<p>Vamos usar este exemplo enquanto detalhamos cada operador de compara\u00e7\u00e3o a seguir.<\/p>\n<h4>Igual a ($eq)<\/h4>\n<p>Este operador corresponde aos valores que s\u00e3o iguais ao valor dado:<\/p>\n<pre><code class=\"language-php\">{ &lt;field&gt;: { $eq: &lt;value&gt; } }<\/code><\/pre>\n<p>Por exemplo, se quisermos recuperar um documento espec\u00edfico da cole\u00e7\u00e3o de invent\u00e1rio com o valor exato da quantidade &#8220;20&#8221;, inserimos o seguinte comando:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { qty: { $eq: 20 } } )<\/code><\/pre>\n<p>A consulta retornaria o seguinte:<\/p>\n<pre><code class=\"language-php\">{ _id: 2, item: { name: \"banana\", code: \"123\" }, qty: 20, tags: [ \"B\" ] }, \n{ _id: 5, item: { name: \"pears\", code: \"000\" }, qty: 20, tags: [ [ \"A\", \"B\" ], \"C\" ] }<\/code><\/pre>\n<h4>Maior do que ($gt)<\/h4>\n<p>Este operador corresponde se os valores forem maiores que o valor dado:<\/p>\n<pre><code class=\"language-php\">{ field: { $gt: value } }<\/code><\/pre>\n<p>Neste exemplo, n\u00f3s recuperamos os documentos onde a quantidade \u00e9 maior que 15:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $gt: 15}})<\/code><\/pre>\n<p>A consulta retornaria o seguinte:<\/p>\n<pre><code class=\"language-php\">{ _id: 2, item: { name: \"banana\", code: \"123\" }, qty: 20, tags: [ \"B\" ] }\n{ _id: 3, item: { name: \"spinach\", code: \"456\" }, qty: 25, tags: [ \"A\", \"B\" ] }\n{ _id: 4, item: { name: \"lentils\", code: \"456\" }, qty: 30, tags: [ \"B\", \"A\" ] }\n{ _id: 5, item: { name: \"pears\", code: \"000\" }, qty: 20, tags: [ [ \"A\", \"B\" ], \"C\" ] }<\/code><\/pre>\n<h4>Menor do que ($lt)<\/h4>\n<p>Este operador corresponde se os valores forem menores que o valor fornecido:<\/p>\n<pre><code class=\"language-php\">{ field: { $lt: value } }<\/code><\/pre>\n<p>Vamos encontrar os documentos com uma quantidade inferior a 25:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $lt: 25}})<\/code><\/pre>\n<p>A consulta retornaria o seguinte:<\/p>\n<pre><code class=\"language-php\">{ _id: 1, item: { name: \"apple\", code: \"123\" }, qty: 15, tags: [ \"A\", \"B\", \"C\" ] }\n{ _id: 2, item: { name: \"banana\", code: \"123\" }, qty: 20, tags: [ \"B\" ] }\n{ _id: 5, item: { name: \"pears\", code: \"000\" }, qty: 20, tags: [ [ \"A\", \"B\" ], \"C\" ] }<\/code><\/pre>\n<h4>Maior ou igual a ($gte)<\/h4>\n<p>Este operador combina quando os valores s\u00e3o maiores ou iguais ao valor dado:<\/p>\n<pre><code class=\"language-php\">{ field: { $gte: value } }<\/code><\/pre>\n<p>Neste exemplo, n\u00f3s recuperamos os documentos onde a quantidade \u00e9 maior ou igual a 25:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $gte: 25}})<\/code><\/pre>\n<p>Esta consulta retornaria o seguinte:<\/p>\n<pre><code class=\"language-php\">{ _id: 3, item: { name: \"spinach\", code: \"456\" }, qty: 25, tags: [ \"A\", \"B\" ] }\n{ _id: 4, item: { name: \"lentils\", code: \"456\" }, qty: 30, tags: [ \"B\", \"A\" ] }<\/code><\/pre>\n<h4>Menor ou igual a ($lte)<\/h4>\n<p>Este operador s\u00f3 corresponde se os valores forem menores ou iguais ao valor dado:<\/p>\n<pre><code class=\"language-php\">{ field: { $lte: value } }<\/code><\/pre>\n<p>Vamos encontrar os documentos com uma quantidade menor ou igual a 25.<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\"qty\": { $lte: 25}})<\/code><\/pre>\n<p>Podemos esperar que esta consulta retorne o seguinte:<\/p>\n<pre><code class=\"language-php\">{ _id: 1, item: { name: \"apple\", code: \"123\" }, qty: 15, tags: [ \"A\", \"B\", \"C\" ] }\n{ _id: 2, item: { name: \"banana\", code: \"123\" }, qty: 20, tags: [ \"B\" ] }\n{ _id: 3, item: { name: \"spinach\", code: \"456\" }, qty: 25, tags: [ \"A\", \"B\" ] }\n{ _id: 5, item: { name: \"pears\", code: \"000\" }, qty: 20, tags: [ [ \"A\", \"B\" ], \"C\" ] }<\/code><\/pre>\n<h4>Em ($in)<\/h4>\n<p>Este operador retorna os documentos que correspondem aos valores especificados:<\/p>\n<pre><code class=\"language-php\">{ field: { $in: [&lt;value1&gt;, &lt;value2&gt;, ... &lt;valueN&gt; ] } }<\/code><\/pre>\n<p>O valor de um campo \u00e9 igual a qualquer valor na matriz especificada. Para recuperar os documentos com os valores &#8220;30&#8221; e &#8220;15&#8221; na cole\u00e7\u00e3o de invent\u00e1rio, por exemplo, voc\u00ea faria isso:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({ \"qty\": { $in: [30, 15]}})<\/code><\/pre>\n<p>A sa\u00edda seria:<\/p>\n<pre><code class=\"language-php\">{ _id: 1, item: { name: \"apple\", code: \"123\" }, qty: 15, tags: [ \"A\", \"B\", \"C\" ] }\n{ _id: 4, item: { name: \"lentils\", code: \"456\" }, qty: 30, tags: [ \"B\", \"A\" ] }<\/code><\/pre>\n<h4>N\u00e3o em ($nin)<\/h4>\n<p>Este operador devolve os documentos que n\u00e3o correspondem aos valores dados. Aqui est\u00e1 a sintaxe b\u00e1sica do operador <code>$nin<\/code>:<\/p>\n<pre><code class=\"language-php\">{ field: { $nin: [ &lt;value1&gt;, &lt;value2&gt; ... &lt;valueN&gt; ]<\/code><\/pre>\n<p><code>$nin<\/code> seleciona os documentos onde:<\/p>\n<ul>\n<li>o valor do campo n\u00e3o est\u00e1 na matriz especificada; ou<\/li>\n<li>o campo n\u00e3o existe.<\/li>\n<\/ul>\n<p>Caso o campo cont\u00e9m matrizes, ele ir\u00e1 escolher matrizes onde nenhum elemento especificado na se\u00e7\u00e3o de valores est\u00e1 presente. Por exemplo, n\u00f3s queremos selecionar aqueles documentos onde a quantidade n\u00e3o \u00e9 igual a 20 ou 15.<\/p>\n<p>Al\u00e9m disso, ele tamb\u00e9m combina com documentos que n\u00e3o t\u00eam um campo de quantidade:<\/p>\n<pre><code>db.inventory.find({ \"qty\": { $nin: [ 20, 15 ]}})<\/code><\/pre>\n<p>A sa\u00edda seria:<\/p>\n<pre><code class=\"language-php\">{ _id: 3, item: { name: \"spinach\", code: \"456\" }, qty: 25, tags: [ \"A\", \"B\" ] }\n{ _id: 4, item: { name: \"lentils\", code: \"456\" }, qty: 30, tags: [ \"B\", \"A\" ] }\n{ _id: 6, item: { name: \"strawberry\", code: \"123\" }, tags: [ \"B\" ] }<\/code><\/pre>\n<h4>N\u00e3o igual ($ne)<\/h4>\n<p>O operador <code>$ne<\/code> retorna os documentos onde o valor especificado n\u00e3o \u00e9 igual:<\/p>\n<pre><code class=\"language-php\">{ $ne: value } }<\/code><\/pre>\n<p>Por exemplo, digamos que queremos selecionar todos os documentos onde a quantidade n\u00e3o \u00e9 igual a 20:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { qty: { $ne: 20 } } )<\/code><\/pre>\n<p>A sa\u00edda seria:<\/p>\n<pre><code class=\"language-php\">{ _id: 1, item: { name: \"apple\", code: \"123\" }, qty: 15, tags: [ \"A\", \"B\", \"C\" ] }\n{ _id: 3, item: { name: \"spinach\", code: \"456\" }, qty: 25, tags: [ \"A\", \"B\" ] }\n{ _id: 4, item: { name: \"lentils\", code: \"456\" }, qty: 30, tags: [ \"B\", \"A\" ] }\n{ _id: 6, item: { name: \"strawberry\", code: \"123\" }, tags: [ \"B\" ] }<\/code><\/pre>\n<p>Da sa\u00edda acima, a consulta selecionar\u00e1 documentos que n\u00e3o possuem um campo de quantidade.<\/p>\n<h3>Operadores de elementos<\/h3>\n<p>Os operadores de consulta de elementos podem identificar os documentos usando os campos do documento. Os operadores de elementos consistem em <code>$exist<\/code> e <code>$type<\/code>.<\/p>\n<h4>$exists<\/h4>\n<p>Este operador combina documentos com um campo espec\u00edfico. Este operador tem um valor booleano que pode ser <code>true<\/code> ou <code>false<\/code>.<\/p>\n<p>Se especificado para ser <code>true<\/code>, ele corresponde aos documentos que cont\u00eam aquele campo, incluindo documentos onde o valor do campo \u00e9 nulo. Se &lt;boolean&gt; \u00e9 <code>false<\/code>, ent\u00e3o a consulta retorna apenas os documentos que n\u00e3o cont\u00eam o campo.<\/p>\n<p>Aqui est\u00e1 a sintaxe padr\u00e3o:<\/p>\n<pre><code class=\"language-php\">{ field: { $exists: &lt;boolean&gt; } })<\/code><\/pre>\n<p>Vamos dar um exemplo onde temos uma coleta de dados para uma matriz chamada &#8220;bagofmarbles&#8221;, onde cada bolsa cont\u00e9m m\u00e1rmores de diferentes cores:<\/p>\n<pre><code class=\"language-php\">{ red: 5, green: 5, blue: null }\n{ red: 3, green: null, blue: 8 }\n{ red: null, green: 3, blue: 9 }\n{ red: 1, green: 2, blue: 3 }\n{ red: 2, blue: 5 }\n{ red: 3, green: 2 }\n{ red: 4 }\n{ green: 2, blue: 4 }\n{ green: 2 }\n{ blue: 6 }<\/code><\/pre>\n<p>Digamos que queremos uma consulta que devolva apenas aqueles sacos onde existem os m\u00e1rmores vermelhos. Isto significa que ter\u00edamos que inserir o valor booleano como <code>true<\/code>. Vamos dar uma olhada:<\/p>\n<pre><code class=\"language-php\">db.bagofmarbles.find( { red: { $exists: true } } )<\/code><\/pre>\n<p>Os resultados consistiriam daqueles documentos que cont\u00eam o campo &#8220;vermelho&#8221;, mesmo que o valor fosse <code>null<\/code>. Entretanto, n\u00e3o consistiria dos documentos onde o campo &#8220;vermelho&#8221; n\u00e3o existia:<\/p>\n<pre><code class=\"language-php\">{ red: 5, green: 5, blue: null }\n{ red: 3, green: null, blue: 8 }\n{ red: null, green: 3, blue: 9 }\n{ red: 1, green: 2, blue: 3 }\n{ red: 2, blue: 5 }\n{ red: 3, green: 2 }\n{ red: 4 }<\/code><\/pre>\n<p>Se quis\u00e9ssemos apenas as bolsas onde os m\u00e1rmores vermelhos nem sequer existem como um campo, podemos entrar na consulta abaixo:<\/p>\n<pre><code class=\"language-php\">db.bagofmarbles.find( { red: { $exists: false} )<\/code><\/pre>\n<p>Os resultados consistiriam naqueles documentos que n\u00e3o cont\u00eam o campo &#8220;vermelho&#8221;:<\/p>\n<pre><code class=\"language-php\">{ green: 2, blue: 4 }\n{ green: 2 }\n{ blue: 6 }<\/code><\/pre>\n<h4>$type<\/h4>\n<p>Este operador combina documentos conforme o tipo de campo especificado. Isto \u00e9 \u00fatil quando voc\u00ea tem dados altamente n\u00e3o estruturados, ou quando os tipos de dados n\u00e3o s\u00e3o previs\u00edveis. Estes tipos de campo s\u00e3o especificados tipos de BSON e podem ser definidos pelo n\u00famero do tipo ou ali\u00e1s.<\/p>\n<p>Esta \u00e9 a sintaxe geral para <code>$type<\/code>:<\/p>\n<pre><code class=\"language-php\">{ field: { $type: &lt;BSON type&gt; } }<\/code><\/pre>\n<p>Digamos que temos uma lista de endere\u00e7os contendo os documentos abaixo:<\/p>\n<pre><code class=\"language-php\">db={\n  addressBook: [\n    {\n      \"_id\": 1,\n      address: \"2100 Jupiter Spot\",\n      zipCode: \"9036325\"\n    },\n    {\n      \"_id\": 2,\n      address: \"25 Moon Place\",\n      zipCode: 26237\n    },\n    {\n      \"_id\": 3,\n      address: \"2324 Neptune Ring\",\n      zipCode: NumberLong(77622222)\n    },\n    {\n      \"_id\": 4,\n      address: \"33 Saturns Moon\",\n      zipCode: NumberInt(117)\n    },\n    {\n      \"_id\": 5,\n      address: \"1044 Venus Lane\",\n      zipCode: [\n        \"99883637232\",\n        \"73488976234\"\n      ]\n    }\n  ]\n}<\/code><\/pre>\n<p>Ao observar os documentos acima, o c\u00f3digo postal tem diferentes tipos de dados. Isto inclui valores longos, duplos, inteiros e string.<\/p>\n<p>Se queremos apenas aqueles documentos com um tipo de dado especificado como o c\u00f3digo postal &#8211; vamos tomar a string para este exemplo &#8211; ter\u00edamos que inserir a seguinte consulta no compilador:<\/p>\n<pre><code class=\"language-php\">db.addressBook.find({\n  \"zipCode\": {\n    $type: \"string\"\n  }\n})<\/code><\/pre>\n<p>Isto retornaria os seguintes documentos:<\/p>\n<pre><code class=\"language-php\">[\n  {\n    \"_id\": 1,\n    \"address\": \"2100 Jupiter Spot\",\n    \"zipCode\": \"9036325\"\n  },\n  {\n    \"_id\": 5,\n    \"address\": \"1044 Venus Lane\",\n    \"zipCode\": [\n      \"99883637232\",\n      \"73488976234\"\n    ]\n  }\n]<\/code><\/pre>\n<p>Al\u00e9m disso, h\u00e1 um tipo &#8220;n\u00famero&#8221;, que inclui todos os valores longos, inteiros ou duplos como um array contendo um elemento dos tipos especificados:<\/p>\n<pre><code class=\"language-php\">db.addressBook.find( { \"zipCode\" : { $type : \"number\" } } )<\/code><\/pre>\n<p>Sa\u00edda:<\/p>\n<pre><code class=\"language-php\">[\n{\n      \"_id\": 2,\n      address: \"25 Moon Place\",\n      zipCode: 26237\n    },\n    {\n      \"_id\": 3,\n      address: \"2324 Neptune Ring\",\n      zipCode: NumberLong(77622222)\n    },\n    {\n      \"_id\": 4,\n      address: \"33 Saturns Moon\",\n      zipCode: NumberInt(117)\n    }\n]<\/code><\/pre>\n<p>Caso os documentos tiverem um tipo de campo array, o operador <code>$type<\/code> retorna os documentos nos quais pelo menos um elemento array corresponde ao tipo passado para o operador.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>De MongoDB 3.6 e posteriores, consultando <code>$type: \"array\"<\/code>\u00a0retorna documentos onde o campo em si \u00e9 um array. Entretanto, enquanto usando a mesma consulta, as vers\u00f5es anteriores usavam para retornar documentos onde o campo \u00e9 um array, e pelo menos um elemento era do tipo array de dados.<\/p>\n<\/aside>\n\n<h3>Operadores de Array<\/h3>\n<p>MongoDB tamb\u00e9m consiste em operadores de matriz, para consultar documentos contendo matrizes.<\/p>\n<p>Existem tr\u00eas operadores prim\u00e1rios: <code>$all<\/code>, <code>$elemMatch<\/code> e <code>$size<\/code>. Discutiremos cada uma delas em detalhes abaixo.<\/p>\n<h4>$all<\/h4>\n<p>O operador <code>$all<\/code> escolhe os documentos nos quais o valor de um campo \u00e9 um array contendo os elementos especificados:<\/p>\n<pre><code class=\"language-php\">{ : { $all: [ &lt;value1&gt; , &lt;value2&gt; ... ] } }<\/code><\/pre>\n<p>Por exemplo, digamos que temos uma cole\u00e7\u00e3o de documentos para uma loja de roupas, com o seguinte em invent\u00e1rio.<\/p>\n<pre><code class=\"language-php\">{\n   _id: ObjectId(\"5234cc89687ea597eabee675\"),\n   code: \"shirt\",\n   tags: [ \"sale\", \"shirt\", \"button\", \"y2k\", \"casual\" ],\n   qty: [\n          { size: \"S\", num: 10, color: \"blue\" },\n          { size: \"M\", num: 45, color: \"blue\" },\n          { size: \"L\", num: 100, color: \"green\" }\n        ]\n},\n\n{\n   _id: ObjectId(\"5234cc8a687ea597eabee676\"),\n   code: \"pant\",\n   tags: [ \"y2k\", \"trendy\", \"shine\" ],\n   qty: [\n          { size: \"6\", num: 100, color: \"green\" },\n          { size: \"6\", num: 50, color: \"blue\" },\n          { size: \"8\", num: 100, color: \"brown\" }\n        ]\n},\n\n{\n   _id: ObjectId(\"5234ccb7687ea597eabee677\"),\n   code: \"pant2\",\n   tags: [ \"trendy\", \"shine\" ],\n   qty: [\n          { size: \"S\", num: 10, color: \"blue\" },\n          { size: \"M\", num: 100, color: \"blue\" },\n          { size: \"L\", num: 100, color: \"green\" }\n        ]\n},\n\n{\n   _id: ObjectId(\"52350353b2eff1353b349de9\"),\n   code: \"shirt2\",\n   tags: [ \"y2k\", \"trendy\" ],\n   qty: [\n          { size: \"M\", num: 100, color: \"green\" }\n        ]\n}<\/code><\/pre>\n<p>Queremos recuperar quaisquer documentos (neste caso, as roupas) do invent\u00e1rio, que est\u00e3o ligados \u00e0s tags &#8220;trendy&#8221; e &#8220;y2k&#8221;. A consulta abaixo usa o operador <code>$all<\/code> onde o valor do campo das etiquetas \u00e9 um array cujos elementos incluem &#8220;y2k&#8221; e &#8220;trendy&#8221;:<\/p>\n<pre><code class=\"language-php\">db.inventory.find( { tags: { $all: [ \"y2k\", \"trendy\" ] } } )<\/code><\/pre>\n<p>A consulta acima retorna o seguinte:<\/p>\n<pre><code class=\"language-php\">{\n   _id: ObjectId(\"5234cc8a687ea597eabee676\"),\n   code: \"pant\",\n   tags: [ \"y2k\", \"trendy\", \"shine\" ],\n   qty: [\n          { size: \"6\", num: 100, color: \"green\" },\n          { size: \"6\", num: 50, color: \"blue\" },\n          { size: \"8\", num: 100, color: \"brown\" }\n        ]\n}\n\n{\n   _id: ObjectId(\"52350353b2eff1353b349de9\"),\n   code: \"shirt2\",\n   tags: [ \"y2k\", \"trendy\" ],\n   qty: [\n          { size: \"M\", num: 100, color: \"green\" }\n        ]\n}<\/code><\/pre>\n<p>A partir do exemplo acima, n\u00f3s tamb\u00e9m descobrimos que o operador <code>$all<\/code> simplesmente desempenha a mesma fun\u00e7\u00e3o que a opera\u00e7\u00e3o <code>$and<\/code>.<\/p>\n<p>Alternativamente, n\u00f3s poder\u00edamos usar a consulta abaixo que daria uma sa\u00edda como acima:<\/p>\n<pre><code class=\"language-php\">db.inventory.find({\n  $and: [\n    {\n      tags: \"y2k\"\n    },\n    {\n      tags: \"trendy\"\n    }\n  ]\n})<\/code><\/pre>\n<h4>$elemMatch<\/h4>\n<p>O operador <code>$elemMatch<\/code> combina documentos que cont\u00eam um campo de matriz com pelo menos um elemento que corresponde a todos os crit\u00e9rios de consulta especificados:<\/p>\n<pre><code class=\"language-php\">{ : { $elemMatch: { &lt;query1&gt;, &lt;query2&gt;, ... } } }<\/code><\/pre>\n<p>Embora possamos utilizar operadores de compara\u00e7\u00e3o como <code>$lte<\/code> e <code>$gte<\/code>, se especificarmos apenas uma \u00fanica condi\u00e7\u00e3o de consulta dentro de <code>$elemMatch<\/code>, e n\u00e3o estivermos utilizando o <code>$not<\/code> ou os operadores de <code>$ne<\/code>, a utiliza\u00e7\u00e3o do <code>$elemMatch<\/code> pode ser omitida, pois ele estaria essencialmente desempenhando a mesma fun\u00e7\u00e3o.<\/p>\n<p>H\u00e1 mais algumas coisas para se ter em mente ao usar este operador, principalmente:<\/p>\n<ul>\n<li>Voc\u00ea n\u00e3o pode especificar uma express\u00e3o <code>$where<\/code> em uma opera\u00e7\u00e3o <code>$elemMatch<\/code>.<\/li>\n<li>Voc\u00ea n\u00e3o pode especificar uma express\u00e3o de consulta <code>$text<\/code> em uma opera\u00e7\u00e3o <code>$elemMatch<\/code>.<\/li>\n<\/ul>\n<p>Por exemplo, n\u00f3s temos os seguintes documentos na cole\u00e7\u00e3o de resultados dos alunos:<\/p>\n<pre><code class=\"language-php\">{ _id: 1, results: [ 92, 89, 98 ] }\n{ _id: 2, results: [ 85, 99, 99 ] }<\/code><\/pre>\n<p>A consulta a seguir corresponde apenas \u00e0queles documentos onde a matriz de resultados cont\u00e9m pelo menos um elemento que \u00e9 maior ou igual a 90 e \u00e9 menor que 95:<\/p>\n<pre><code class=\"language-php\">db.studentresults.find(  { results: { $elemMatch: { $gte: 90, $lt: 95 } } })<\/code><\/pre>\n<p>Nossa consulta retorna o seguinte documento, j\u00e1 que o elemento 92 \u00e9 maior ou igual a 90 e \u00e9 inferior a 95:<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 1, \"results\" :[ 92, 89, 98 ] }<\/code><\/pre>\n<h4>$size<\/h4>\n<p>O operador <code>$size<\/code> retorna aqueles documentos onde o tamanho da matriz corresponde ao n\u00famero de elementos especificados no argumento:<\/p>\n<pre><code class=\"language-php\">{ field: { $size: value } }<\/code><\/pre>\n<p>Aqui est\u00e1 um exemplo:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { field: { $size: 2 } });<\/code><\/pre>\n<p>Isto devolveria todos os documentos da cole\u00e7\u00e3o especificada onde o campo \u00e9 um array com 2 elementos: <code>{ field: [ orange, apple] }<\/code> e <code>{ field: [ blue, red] }<\/code>, mas n\u00e3o <code>{ field: blue}<\/code> ou <code>{ field: [ raspberry, lemon, grapefruit ] }<\/code>.<\/p>\n<p>Entretanto, embora possamos inserir o valor espec\u00edfico como o tamanho, n\u00e3o podemos especificar intervalos de valores como o tamanho.<\/p>\n<h3>Operadores geoespaciais<\/h3>\n<p>O MongoDB permite que voc\u00ea armazene dados geoespaciais na forma de tipos GeoJSON. GeoJSON \u00e9 um formato de padr\u00e3o aberto baseado na nota\u00e7\u00e3o de objetos JavaScript que pode representar caracter\u00edsticas geogr\u00e1ficas e suportar atributos n\u00e3o-espaciais. H\u00e1 dois tipos de operadores geoespaciais que vamos falar neste artigo: especificadores de geometria e seletores de consulta.<\/p>\n<h4>$geometry<\/h4>\n<p>Este operador menciona a geometria do GeoJSON para uso com os seguintes operadores de consulta geoespacial: <code>$geoIntersects<\/code>, <code>$geoWithin<\/code>,<code>$nearSphere<\/code>, e <code>$near<\/code>. <code>$geometry<\/code> alavanca EPSG:4326 como o sistema de refer\u00eancia de coordenadas padr\u00e3o (CRS).<\/p>\n<p>Para mencionar os objetos GeoJSON com o CRS padr\u00e3o, voc\u00ea pode aproveitar o seguinte trecho para <code>$geometry<\/code>:<\/p>\n<pre><code class=\"language-php\">$geometry: {\n   type: \"&lt;GeoJSON object type&gt;\",\n   coordinates: [ &lt;coordinates&gt; ]\n}<\/code><\/pre>\n<p>Para mencionar um pol\u00edgono GeoJSON de anel \u00fanico com um CRS MongoDB sob medida, voc\u00ea pode usar o seguinte trecho (voc\u00ea s\u00f3 pode usar isso para <code>$geoWithin<\/code> e <code>$geoIntersects<\/code>):<\/p>\n<pre><code class=\"language-php\">$geometry: {\n   type: \"Polygon\",\n   coordinates: [ &lt;coordinates&gt; ],\n   crs: {\n      type: \"name\",\n      properties: { name: \"urn:x-mongodb:crs:strictwinding:EPSG:4326\" }\n   }\n}<\/code><\/pre>\n<h4>$polygon<\/h4>\n<p>O operador <code>$polygon<\/code> pode ser usado para especificar um pol\u00edgono para uma consulta geoespacial <code>$geoWithin<\/code> em pares de coordenadas legados. Esta consulta ir\u00e1 ent\u00e3o retornar pares que se enquadram nos limites do pol\u00edgono. Entretanto,<code> $polygon<\/code> n\u00e3o far\u00e1 consultas para nenhum objeto GeoJSON. Para definir um pol\u00edgono, voc\u00ea precisa especificar uma matriz de pontos de coordenadas como a seguir:<\/p>\n<pre><code class=\"language-php\">{\n   : {\n      $geoWithin: {\n         $polygon: [ [ &lt;x1&gt; , &lt;y1&gt; ], [ &lt;x2&gt; , &lt;y2&gt; ], [ &lt;x3&gt; , &lt;y3&gt; ], ... ]\n      }\n   }\n}<\/code><\/pre>\n<p>Aqui, o \u00faltimo ponto est\u00e1 implicitamente ligado ao primeiro. Voc\u00ea pode mencionar quantos pontos ou lados voc\u00ea quiser.<\/p>\n<p>Por exemplo, a seguinte consulta retornar\u00e1 todos os documentos que t\u00eam coordenadas que existem no pol\u00edgono definido por [0,0], [1,5], e [3,3]:<\/p>\n<pre><code class=\"language-php\">db.places.find(\n  {\n     loc: {\n       $geoWithin: { $polygon: [ [ 0 , 0 ], [ 1 , 5 ], [ 3 , 3 ] ] }\n     }\n  }\n)<\/code><\/pre>\n<h4>$geoWithin<\/h4>\n<p>Este operador pode ser usado para escolher documentos com dados geoespaciais que est\u00e3o completamente contidos em um formato espec\u00edfico. A forma especificada pode ser um multipol\u00edgono GeoJSON, um pol\u00edgono GeoJSON (multianelar ou anelar \u00fanico), ou uma forma que pode ser definida por pares de coordenadas legados.<\/p>\n<p>O operador <code>$geoWithin<\/code> ir\u00e1 aproveitar o operador <code>$geometry<\/code> para mencionar o objeto GeoJSON.<\/p>\n<p>Para mencionar os multipol\u00edgonos ou pol\u00edgonos GeoJSON atrav\u00e9s do Sistema de Refer\u00eancia de Coordenadas (CRS) padr\u00e3o, voc\u00ea pode utilizar a sintaxe mencionada abaixo:<\/p>\n<pre><code class=\"language-php\">{\n   : {\n      $geoWithin: {\n         $geometry: {\n            type: &lt;\"Polygon\" or \"MultiPolygon\"&gt; ,\n            coordinates: [ &lt;coordinates&gt; ]\n         }\n      }\n   }\n}<\/code><\/pre>\n<p>Para <code>$geoWithin<\/code> consultas que mencionam as geometrias do GeoJSON com \u00e1reas maiores que um \u00fanico hemisf\u00e9rio, o uso do CRS padr\u00e3o levaria a consultas para as geometrias complementares.<\/p>\n<p>Para mencionar um pol\u00edgono GeoJSON de anel \u00fanico com um CRS MongoDB personalizado, voc\u00ea pode alavancar o prot\u00f3tipo mencionado abaixo na express\u00e3o <code>$geometry<\/code>:<\/p>\n<pre><code class=\"language-php\">{\n   : {\n      $geoWithin: {\n         $geometry: {\n           type: \"Polygon\" ,\n           coordinates: [ &lt;coordinates&gt; ],\n           crs: {\n              type: \"name\",\n              properties: { name: \"urn:x-mongodb:crs:strictwinding:EPSG:4326\" }\n           }\n         }\n      }\n   }\n}<\/code><\/pre>\n<p>O exemplo a seguir escolhe todos os dados de localiza\u00e7\u00e3o que existem completamente dentro de um pol\u00edgono GeoJSON, sendo a \u00e1rea do pol\u00edgono menor do que a \u00e1rea de um \u00fanico hemisf\u00e9rio:<\/p>\n<pre><code class=\"language-php\">db.places.find(\n   {\n     loc: {\n       $geoWithin: {\n          $geometry: {\n             type : \"Polygon\" ,\n             coordinates: [ [ [ 0, 0 ], [ 3, 6 ], [ 6, 1 ], [ 0, 0 ] ] ]\n          }\n       }\n     }\n   }\n)<\/code><\/pre>\n<h4>$box<\/h4>\n<p>Voc\u00ea pode usar <code>$box<\/code> para especificar um ret\u00e2ngulo para uma consulta geoespacial <code>$geoWithin<\/code> para fornecer documentos que est\u00e3o nos limites do ret\u00e2ngulo, de acordo com seus dados de localiza\u00e7\u00e3o baseados em pontos. Quando voc\u00ea usar <code>$geoWithin<\/code> com o <code>$box<\/code>, voc\u00ea obter\u00e1 documentos baseados nas coordenadas da consulta. Neste cen\u00e1rio, <code>$geoWithin<\/code> n\u00e3o far\u00e1 consultas para nenhuma forma de GeoJSON.<\/p>\n<p>Para alavancar o operador <code>$box<\/code>, voc\u00ea precisa mencionar os cantos superior direito e inferior esquerdo do ret\u00e2ngulo em um objeto de matriz:<\/p>\n<pre><code class=\"language-php\">{ &lt;location field&gt; : { $geoWithin: { $box: [ [ &lt;bottom left coordinates&gt; ],\n [ &lt;upper right coordinates&gt; ] ] } } }<\/code><\/pre>\n<p>A consulta mencionada acima calcular\u00e1 a dist\u00e2ncia utilizando a geometria plana (planar). A consulta a seguir retornar\u00e1 todos os documentos que est\u00e3o dentro da caixa com pontos em: [0,0], [0,30], [30,0], [30,30]:<\/p>\n<pre><code class=\"language-php\">db.places.find ( { \n loc: { $geoWithin: { $box: [ [ 0,0 ], [ 30,30 ] ] } }\n} )<\/code><\/pre>\n<h4>$nearSphere<\/h4>\n<p>Voc\u00ea pode usar <code>$nearSphere<\/code> para mencionar um ponto para o qual uma consulta geoespacial retorna os documentos do mais pr\u00f3ximo para o mais distante.<\/p>\n<p>MongoDB usa geometria esf\u00e9rica para calcular as dist\u00e2ncias para <code>$nearSphere<\/code>. Ele precisar\u00e1 de um \u00edndice geoespacial como a seguir:<\/p>\n<ol>\n<li>\u00edndice 2d para dados de localiza\u00e7\u00e3o descritos como pares de coordenadas legados. Para aproveitar um \u00edndice 2d em pontos GeoJSON, voc\u00ea precisa gerar o \u00edndice no campo de coordenadas do objeto GeoJSON.<\/li>\n<li>\u00edndice 2dsphere para os dados de localiza\u00e7\u00e3o descritos como pontos GeoJSON.<\/li>\n<\/ol>\n<p>Para mencionar um ponto GeoJSON, voc\u00ea pode alavancar a seguinte sintaxe:<\/p>\n<pre><code class=\"language-php\">{\n  $nearSphere: {\n     $geometry: {\n        type : \"Point\",\n        coordinates : [ &lt;longitude&gt;, &lt;latitude&gt; ]\n     },\n     $minDistance: &lt;distance in meters&gt;,\n     $maxDistance: &lt;distance in meters&gt; \n  }\n}<\/code><\/pre>\n<p>Aqui, <code>$minDistance<\/code> e <code>$maxDistance<\/code> s\u00e3o opcionais. <code>$minDistance<\/code> pode limitar os resultados aos documentos que estejam pelo menos \u00e0 dist\u00e2ncia especificada do centro. Voc\u00ea pode usar <code>$maxDistance<\/code> para qualquer \u00edndice.<\/p>\n<p>Agora, considere uma cole\u00e7\u00e3o de &#8220;lugares&#8221; que consiste em documentos com um campo de localiza\u00e7\u00e3o com um \u00edndice de 2dsphere. O exemplo a seguir retornaria os pontos cuja localiza\u00e7\u00e3o \u00e9 de pelo menos 2.000 metros e no m\u00e1ximo 6.000 metros do ponto que voc\u00ea escolher, ordenados do mais pr\u00f3ximo ao mais distante:<\/p>\n<pre><code class=\"language-php\">db.places.find(\n   {\n     location: {\n        $nearSphere: {\n           $geometry: {\n              type : \"Point\",\n              coordinates : [ -43.9532, 50.32 ]\n           },\n           $minDistance: 2000,\n           $maxDistance: 6000\n        }\n     }\n   }\n)<\/code><\/pre>\n<h4>$geoIntersects<\/h4>\n<p>O operador <code>$geoIntersects<\/code> permite que voc\u00ea selecione documentos cujos dados geoespaciais se cruzam com um objeto GeoJSON particular (isto \u00e9, onde a converg\u00eancia do objeto especificado e os dados n\u00e3o est\u00e3o vazios). Ele alavanca o operador <code>$geometry<\/code> para especificar o objeto GeoJSON.<\/p>\n<p>Para mencionar GeoJSON multipol\u00edgonos ou pol\u00edgonos atrav\u00e9s do sistema de refer\u00eancia de coordenadas padr\u00e3o (CRS), voc\u00ea pode usar a seguinte sintaxe:<\/p>\n<pre><code class=\"language-php\">{ &lt;location field&gt;: {\n     $geoIntersects: {\n        $geometry: {\n           type: \"&lt;GeoJSON object type&gt;\" ,\n           coordinates: [ &lt;coordinates&gt; ]\n        }\n     }\n  }\n}<\/code><\/pre>\n<p>A seguinte inst\u00e2ncia usar\u00e1 <code>$geoIntersects<\/code> para escolher todos os dados de localiza\u00e7\u00e3o que se cruzam com o pol\u00edgono descrito pela matriz de coordenadas:<\/p>\n<pre><code class=\"language-php\">db.places.find(\n   {\n     loc: {\n       $geoIntersects: {\n          $geometry: {\n             type: \"Polygon\" ,\n             coordinates: [\n               [ [ 0, 0 ], [ 2, 6 ], [ 4, 1 ], [ 0, 0 ] ]\n             ]\n          }\n       }\n     }\n   }\n)<\/code><\/pre>\n<h4>$center<\/h4>\n<p>O operador <code>$center<\/code> menciona um c\u00edrculo para uma consulta <code>$geoWithin<\/code> que retorna os pares de coordenadas legados que est\u00e3o nos limites do c\u00edrculo.<\/p>\n<p><code>$center<\/code> n\u00e3o devolve objetos GeoJSON. Para alavancar o operador <code>$center<\/code>, voc\u00ea precisa especificar um array que contenha:<\/p>\n<ol>\n<li>O raio do c\u00edrculo, conforme medido nas unidades usadas pelo sistema de coordenadas.<\/li>\n<li>As coordenadas de grade do ponto central do c\u00edrculo.<\/li>\n<\/ol>\n<pre><code class=\"language-php\">{\n  &lt;location field&gt; : {\n      $geoWithin: { $center: [ [ &lt;x&gt; , &lt;y&gt; ] , &lt;radius&gt; ] }\n   }\n}<\/code><\/pre>\n<p>O exemplo mencionado abaixo ir\u00e1 retornar todos os documentos que possuem coordenadas que podem ser encontradas dentro do c\u00edrculo centrado em [2,3] e com um raio de 40:<\/p>\n<pre><code class=\"language-php\">db.places.find(\n   { loc: { $geoWithin: { $center: [ [2, 3], 40 ] } } }\n)<\/code><\/pre>\n<h3>Operadores de proje\u00e7\u00e3o<\/h3>\n<p>Voc\u00ea pode usar operadores de proje\u00e7\u00e3o para mencionar os campos devolvidos por uma opera\u00e7\u00e3o. Os operadores de proje\u00e7\u00e3o MongoDB permitem que a fun\u00e7\u00e3o <code>find()<\/code> seja usada com argumentos de filtragem de dados. Isto ajuda os usu\u00e1rios a extrair apenas os campos de dados requeridos de um documento. Assim, ele permite que voc\u00ea projete dados transparentes e concisos sem afetar o desempenho geral do banco de dados.<\/p>\n<h4>$elemMatch (proje\u00e7\u00e3o)<\/h4>\n<p>O operador <code>$elemMatch<\/code> \u00e9 respons\u00e1vel por limitar o conte\u00fado de um campo a partir dos resultados da consulta para conter apenas o primeiro elemento que corresponda \u00e0 condi\u00e7\u00e3o <code>$elemMatch<\/code>.<\/p>\n<p>Aqui est\u00e3o algumas coisas que voc\u00ea precisa ter em mente antes de usar <code>$elemMatch<\/code>:<\/p>\n<ul>\n<li>De MongoDB 4.4, independentemente da ordena\u00e7\u00e3o dos campos no documento, a proje\u00e7\u00e3o <code>$elemMatch<\/code> de um campo existente retorna o campo ap\u00f3s a inclus\u00e3o de outros campos existentes.<\/li>\n<li>Ambos os operadores <code>$elemMatch<\/code> e <code>$<\/code> retratam o primeiro elemento correspondente a partir de um array baseado em uma condi\u00e7\u00e3o especificada. O operador <code>$<\/code> projetaria o primeiro elemento de matriz correspondente de cada documento em uma cole\u00e7\u00e3o baseada em alguma condi\u00e7\u00e3o da declara\u00e7\u00e3o de consulta, enquanto o operador de proje\u00e7\u00e3o <code>$elemMatch<\/code> pega um argumento de condi\u00e7\u00e3o expl\u00edcito. Isto permite que voc\u00ea projete baseado em uma condi\u00e7\u00e3o n\u00e3o presente na consulta, ou se voc\u00ea precisar projetar baseado em v\u00e1rios campos nos documentos embutidos da matriz.<\/li>\n<\/ul>\n<p>Voc\u00ea tamb\u00e9m deve estar ciente das seguintes restri\u00e7\u00f5es antes de usar o operador <code>$elemMatch<\/code> em seus dados:<\/p>\n<ul>\n<li>Voc\u00ea n\u00e3o pode mencionar uma express\u00e3o de consulta <code>$text<\/code> dentro de um operador <code>$elemMatch<\/code>.<\/li>\n<li><code>db.collection.find()<\/code> as opera\u00e7\u00f5es em views n\u00e3o suportam o operador de proje\u00e7\u00e3o <code>$elemMatch<\/code>.<\/li>\n<\/ul>\n<p>O seguinte exemplo no <code>$elemMatch<\/code> operador de proje\u00e7\u00e3o assume uma cole\u00e7\u00e3o <code>schools<\/code> com os seguintes documentos:<\/p>\n<pre><code class=\"language-php\">{\n _id: 1,\n zipcode: \"63108\",\n students: [\n              { name: \"mark\", school: 102, age: 9 },\n              { name: \"geoff\", school: 101, age: 13 },\n              { name: \"frank\", school: 104, age: 12 }\n           ]\n}\n{\n _id: 2,\n zipcode: \"63110\",\n students: [\n              { name: \"harry\", school: 103, age: 14 },\n              { name: \"george\", school: 103, age: 7 },\n           ]\n}\n{\n _id: 3,\n zipcode: \"63108\",\n students: [\n              { name: \"harry\", school: 103, age: 14 },\n              { name: \"george\", school: 103, age: 7 },\n           ]\n}\n{\n _id: 4,\n zipcode: \"63110\",\n students: [\n              { name: \"jim\", school: 103, age: 9 },\n              { name: \"michael\", school: 103, age: 12 },\n           ]\n}<\/code><\/pre>\n<p>Neste caso, a opera\u00e7\u00e3o <code>find()<\/code> consulta todos os documentos onde o valor do campo CEP \u00e9 63110. A proje\u00e7\u00e3o <code>$elemMatch<\/code> retornaria apenas o primeiro elemento correspondente do array <code>students<\/code> onde o campo <code>school<\/code> tem um valor de 103:<\/p>\n<pre><code class=\"language-php\">db.schools.find( { zipcode: \"63110\" },\n                 { students: { $elemMatch: { school: 103 } } } )<\/code><\/pre>\n<p>Este \u00e9 o resultado que o resultado pareceria:<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 2, \"students\" : [ { \"name\" : \"harry\", \"school\" : 103, \"age\" : 14 } ] }\n{ \"_id\" : 4, \"students\" : [ { \"name\" : \"jim\", \"school\" : 103, \"age\" : 9 } ] }<\/code><\/pre>\n<h4>$slice (proje\u00e7\u00e3o)<\/h4>\n<p>O operador de proje\u00e7\u00e3o <code>$slice<\/code> pode ser usado para especificar o n\u00famero de elementos em um array para retornar no resultado da consulta:<\/p>\n<pre><code class=\"language-php\">db.collection.find(\n   &lt;query&gt; ,\n   { &lt;arrayField&gt; : { $slice: &lt;number&gt; } }\n);<\/code><\/pre>\n<p>Ela tamb\u00e9m pode ser expressa desta forma:<\/p>\n<pre><code class=\"language-php\">db.collection.find(\n  &lt;query&gt; ,\n   { &lt;arrayField&gt; : { $slice: [ &lt;number&gt; , &lt;number&gt; ] } }\n);<\/code><\/pre>\n<p>Para demonstrar o mesmo, voc\u00ea pode criar uma cole\u00e7\u00e3o de exemplos de tweets com os seguintes documentos:<\/p>\n<pre><code class=\"language-php\">db.posts.insertMany([\n   {\n     _id: 1,\n     title: \"Nuts are not blueberries.\",\n     comments: [ { comment: \"0. true\" }, { comment: \"1. blueberries aren't nuts.\"} ]\n   },\n   {\n     _id: 2,\n     title: \"Coffee please.\",\n     comments: [ { comment: \"0. Indubitably\" }, { comment: \"1. Cuppa tea please\" }, { comment: \"2. frappucino\" }, { comment: \"3. Mocha latte\" }, { comment: \"4. whatever\" } ]\n   }\n])<\/code><\/pre>\n<p>A opera\u00e7\u00e3o seguinte usaria o operador de proje\u00e7\u00e3o <code>$slice<\/code> na matriz de tweets para retornar a matriz com seus dois primeiros elementos. Caso um array cont\u00e9m menos de dois elementos, todos os elementos do array s\u00e3o devolvidos:<\/p>\n<pre><code class=\"language-php\">db.posts.find( {}, { comments: { $slice: 2 } } )<\/code><\/pre>\n<p>Essa opera\u00e7\u00e3o devolveria os seguintes documentos:<\/p>\n<pre><code class=\"language-php\">{\n   \"_id\" : 1,\n   \"title\" : \"Nuts are not blueberries.\",\n   \"comments\" : [ { \"comment\" : \"0. true\" }, { \"comment\" : \"1. blueberries aren't nuts.\" } ]\n}\n{\n   \"_id\" : 2,\n   \"title\" : \"Coffee please.\",\n   \"comments\" : [ { \"comment\" : \"0. Indubitably\" }, { \"comment\" : \"1. Cuppa tea please\" } ]\n}<\/code><\/pre>\n<h4>$ (proje\u00e7\u00e3o)<\/h4>\n<p>O operador posicional <code>$<\/code> limita o conte\u00fado de uma matriz para retornar o primeiro elemento que corresponda \u00e0 condi\u00e7\u00e3o de consulta dessa matriz. Voc\u00ea pode usar <code>$<\/code> no documento de proje\u00e7\u00e3o do m\u00e9todo <code>find()<\/code> ou o m\u00e9todo <code>findOne()<\/code> quando voc\u00ea precisar apenas de um elemento de array em particular nos documentos escolhidos.<\/p>\n<p>\u00c9 assim que se parece a sintaxe do operador <code>$<\/code>:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { &lt;array&gt;: &lt;condition&gt; ... },\n                    { \"&lt;array&gt;.$\": 1 } )\ndb.collection.find( { &lt;array.field&gt;: &lt;condition&gt; ...},\n                    { \"&lt;array&gt;.$\": 1 } )<\/code><\/pre>\n<p>Neste exemplo, a cole\u00e7\u00e3o <code>students<\/code> \u00e9 composta pelos seguintes documentos:<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 1, \"semester\" : 2, \"grades\" : [ 75, 67, 93 ] }\n{ \"_id\" : 2, \"semester\" : 2, \"grades\" : [ 60, 68, 72 ] }\n{ \"_id\" : 3, \"semester\" : 2, \"grades\" : [ 95, 82, 67 ] }\n{ \"_id\" : 4, \"semester\" : 3, \"grades\" : [ 89, 95, 70 ] }\n{ \"_id\" : 5, \"semester\" : 3, \"grades\" : [ 68, 98, 82 ] }\n{ \"_id\" : 6, \"semester\" : 3, \"grades\" : [ 65, 70, 76 ] }<\/code><\/pre>\n<p>Na consulta seguinte, a proje\u00e7\u00e3o <code>{ \"grades.$\": 1 }<\/code> retorna apenas o primeiro elemento maior ou igual a 89 para o campo <code>grades<\/code>:<\/p>\n<pre><code class=\"language-php\">db.students.find( { semester: 2, grades: { $gte: 89 } },\n                  { \"grades.$\": 1 } )<\/code><\/pre>\n<p>Esta opera\u00e7\u00e3o retorna os seguintes documentos:<\/p>\n<pre><code class=\"language-php\">{\"_id\": 1, \"grades\": [93] }<\/code><\/pre>\n<h3>Operadores de Avalia\u00e7\u00e3o<\/h3>\n<p>Voc\u00ea pode aproveitar os operadores de avalia\u00e7\u00e3o da MongoDB para medir a estrutura geral dos dados ou o campo individual dentro de um documento.<\/p>\n<p>Vamos olhar para alguns operadores comuns de avalia\u00e7\u00e3o do MongoDB.<\/p>\n<h4>$mod<\/h4>\n<p>Voc\u00ea pode usar este operador para combinar documentos onde o valor de um campo especificado \u00e9 igual ao valor restante ap\u00f3s ser dividido por um valor especificado:<\/p>\n<pre><code class=\"language-php\">{ field: { $mod: [ divisor, remainder ] } }<\/code><\/pre>\n<p>Digamos que voc\u00ea tenha uma tabela de carros pertencentes a diferentes marcas que voc\u00ea possui em seu showroom. A seguinte consulta lhe daria todas as marcas de carros cujos n\u00fameros de estoque est\u00e3o em m\u00faltiplos de 250.<\/p>\n<pre><code class=\"language-php\">db.cars.find ( { qty: { $mod: [ 250,0 ] } } )<\/code><\/pre>\n<h4>$jsonSchema<\/h4>\n<p>O <code>$jsonSchema<\/code> permite que voc\u00ea combine os documentos que combinam com o esquema JSON especificado. A implementa\u00e7\u00e3o do esquema JSON pelo MongoDB inclui a adi\u00e7\u00e3o da palavra-chave <code>bsonType<\/code>, que permite a voc\u00ea usar todos os tipos de BSON no operador <code>$jsonSchema<\/code>.<\/p>\n<p><code>bsonType<\/code> pode aceitar os mesmos pseud\u00f4nimos de cadeia que voc\u00ea usaria para o operador <code>type<\/code>. Isto \u00e9 o que a sintaxe do <code>$jsonSchema<\/code> pareceria:<\/p>\n<pre><code class=\"language-php\">{ $jsonSchema: &lt;JSON Schema object&gt; }<\/code><\/pre>\n<p>Aqui, o objeto do esquema JSON \u00e9 formatado com base no <a href=\"https:\/\/tools.ietf.org\/html\/draft-zyp-json-schema-04\">rascunho 4 do padr\u00e3o de esquema JSON<\/a>:<\/p>\n<pre><code class=\"language-php\">{ &lt;keyword1&gt;: &lt;value1&gt;, ... }<\/code><\/pre>\n<p>Aqui est\u00e1 um exemplo para demonstrar como <code>$jsonSchema<\/code> funciona:<\/p>\n<pre><code class=\"language-php\">{ $jsonSchema: {\n     required: [ \"name\", \"major\", \"gpa\", \"address\" ],\n     properties: {\n        name: {\n           bsonType: \"string\",\n           description: \"must be a string and is required\"\n        },\n        address: {\n           bsonType: \"object\",\n           required: [ \"zipcode\" ],\n           properties: {\n               \"street\": { bsonType: \"string\" },\n               \"zipcode\": { bsonType: \"string\" }\n           }\n        }\n     }\n  }\n}<\/code><\/pre>\n<p>Voc\u00ea tamb\u00e9m pode usar <code>$jsonSchema<\/code> em um validador de documentos para aplicar o esquema especificado nas opera\u00e7\u00f5es de atualiza\u00e7\u00e3o e inser\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-php\">db.createCollection(&lt;collection&gt; , { validator: { $jsonSchema: &lt;schema&gt; } } )\ndb.runCommand( { collMod: &lt;collection&gt;, validator:{ $jsonSchema: &lt;schema&gt; } } )<\/code><\/pre>\n<p>Tenha em mente que h\u00e1 v\u00e1rias coisas que n\u00e3o s\u00e3o suportadas pelo operador <code>$jsonSchema<\/code>:<\/p>\n<ol>\n<li>O tipo inteiro. Voc\u00ea precisa aproveitar o tipo BSON longo ou int com a palavra-chave bsonType.<\/li>\n<li>Palavras-chave desconhecidas.<\/li>\n<li>Liga\u00e7\u00e3o de propriedades e a hiperm\u00eddia do esquema JSON, com o uso de refer\u00eancias JSON e ponteiros JSON.<\/li>\n<\/ol>\n<h4>$text<\/h4>\n<p>O operador <code>$text<\/code> buscaria um texto dentro do conte\u00fado do campo especificado, indexado com um \u00edndice de texto:<\/p>\n<pre><code class=\"language-php\">{  \n  $text:  \n    {  \n      $search: &lt;string&gt;,  \n      $language: &lt;string&gt;,  \n      $caseSensitive: &lt;boolean&gt;,  \n      $diacriticSensitive: &lt;boolean&gt;   \n    }  \n}<\/code><\/pre>\n<p>Neste caso, o seguinte trecho de c\u00f3digo ir\u00e1 peneirar na tabela para filtrar qualquer carro que tenha o texto &#8220;Porsche&#8221; dentro deles:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { $text: { $search: \"Porsche\" } } )<\/code><\/pre>\n<h4>$regex<\/h4>\n<p>O operador <code>$regex<\/code> oferece habilidades de express\u00e3o regular para combinar strings em consultas. MongoDB alavanca express\u00f5es regulares compat\u00edveis com o Perl:<\/p>\n<pre><code class=\"language-php\">{&lt;field&gt; : \/pattern\/ &lt;options&gt;}<\/code><\/pre>\n<p>O exemplo a seguir ajudaria a filtrar todos os carros com a string &#8220;$78900&#8221; presente neles:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { price: { $regex: \/$78900\/ } } )<\/code><\/pre>\n<h4>$expr<\/h4>\n<p>O operador <code>$expr<\/code> permite que voc\u00ea utilize express\u00f5es de agrega\u00e7\u00e3o na linguagem da consulta:<\/p>\n<pre><code class=\"language-php\">{ $expr: { &lt;expression&gt; } }<\/code><\/pre>\n<p>Voc\u00ea tamb\u00e9m pode usar <code>$expr<\/code> para construir express\u00f5es de consulta que comparam campos do mesmo documento em uma etapa <code>$match<\/code>. Se o est\u00e1gio <code>$match<\/code> for parte de um est\u00e1gio <code>$lookup<\/code>, <code>$expr<\/code> pode comparar campos com a ajuda de vari\u00e1veis let.<\/p>\n<h4>$where<\/h4>\n<p>Voc\u00ea pode aproveitar o operador <code>$where<\/code> para passar uma string contendo uma fun\u00e7\u00e3o JavaScript completa ou uma express\u00e3o JavaScript para o sistema de consulta. O operador <code>$where<\/code> fornece maior flexibilidade, mas precisa do banco de dados para processar a fun\u00e7\u00e3o ou express\u00e3o JavaScript para cada documento da cole\u00e7\u00e3o. Voc\u00ea pode referenciar este documento na fun\u00e7\u00e3o ou express\u00e3o JavaScript usando o <code>obj<\/code> ou <code>this<\/code>.<\/p>\n<p>Aqui est\u00e1 um exemplo da sintaxe:<\/p>\n<pre><code class=\"language-php\">{ $where: &lt;string|JavaScript Code&gt; }<\/code><\/pre>\n<p>H\u00e1 algumas considera\u00e7\u00f5es importantes a serem consideradas antes de mergulharmos em um exemplo enquanto usamos o operador <code>$where<\/code>:<\/p>\n<ul>\n<li>Voc\u00ea s\u00f3 deve usar o operador de consulta <code>$where<\/code> para documentos de alto n\u00edvel. O operador de consulta <code>$where<\/code> n\u00e3o funcionar\u00e1 em um documento aninhado, como em uma consulta <code>$elemMatch<\/code>.<\/li>\n<li>Geralmente, voc\u00ea deve usar <code>$where<\/code> somente quando voc\u00ea n\u00e3o puder expressar sua consulta atrav\u00e9s de outro operador. Caso voc\u00ea tiver que usar <code>$where<\/code>, certifique-se de incluir pelo menos um outro operador de consulta padr\u00e3o para filtrar o conjunto de resultados. O uso do <code>$where<\/code> de forma independente requer uma varredura de coleta para uma execu\u00e7\u00e3o adequada.<\/li>\n<\/ul>\n<p>Aqui est\u00e1 um exemplo para ilustrar isto:<\/p>\n<pre><code class=\"language-php\">db.cars.find( { $where: function() {  \n   return (hex_md5(this.name)== \"9a43e617b50cd379dca1bc6e2a8\")  \n} } );<\/code><\/pre>\n<h3>Operadores Bitwise<\/h3>\n<p>Os operadores Bitwise retornam dados com base nas condi\u00e7\u00f5es de posi\u00e7\u00e3o dos bits. Simplificando, eles s\u00e3o usados para combinar valores num\u00e9ricos ou bin\u00e1rios nos quais qualquer bit de um conjunto de posi\u00e7\u00f5es de bit tem um valor de 1, ou 0.<\/p>\n<h4>$bitsAllSet<\/h4>\n<p>Este operador combinar\u00e1 todos os documentos onde todas as posi\u00e7\u00f5es de bit fornecidas pela consulta est\u00e3o definidas (i.e. 1) no campo:<\/p>\n<pre><code class=\"language-php\">{ &lt;field&gt; : { $bitsAllSet: &lt;numeric bitmask&gt; } }<\/code><\/pre>\n<pre><code class=\"language-php\">{ &lt;field&gt; : { $bitsAllSet: &lt; BinData bitmask&gt; } }<\/code><\/pre>\n<pre><code class=\"language-php\">{ &lt;field&gt; : { $bitsAllSet: [ &lt;position1&gt; , &lt;position2&gt; , ... ] } }<\/code><\/pre>\n<p>O valor do campo deve ser ou uma inst\u00e2ncia BinData, ou num\u00e9rico para <code>$bitsAllSet<\/code> para corresponder ao documento atual.<\/p>\n<p>No exemplo a seguir, n\u00f3s estamos alavancando uma cole\u00e7\u00e3o com os seguintes documentos:<\/p>\n<pre><code class=\"language-php\">db.collection.save({ _id: 1, a: 54, binaryValueofA: \"00110110\" })\ndb.collection.save({ _id: 2, a: 20, binaryValueofA: \"00010100\" })\ndb.collection.save({ _id: 3, a: 20.0, binaryValueofA: \"00010100\" })\ndb.collection.save({ _id: 4, a: BinData(0, \"Zg==\"), binaryValueofA: \"01100110\" })<\/code><\/pre>\n<p>A consulta mencionada abaixo usar\u00e1 o operador <code>$bitsAllSet<\/code> para testar se o campo a tem bits definidos na posi\u00e7\u00e3o 1 e posi\u00e7\u00e3o 5, onde o bit menos significativo estaria na posi\u00e7\u00e3o 0:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { a: { $bitsAllSet: [ 1, 5 ] } })<\/code><\/pre>\n<p>Esta consulta corresponderia aos seguintes documentos:<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 1, \"a\" : 54, \"binaryValueofA\" : \"00110110\" }\n{ \"_id\" : 4, \"a\" : BinData(0,\"Zg==\"), \"binaryValueofA\" : \"01100110\" }<\/code><\/pre>\n<h4>$bitsAllClear<\/h4>\n<p>O operador <code>$bitsAllClear<\/code> ir\u00e1 comparar documentos nos quais todas as posi\u00e7\u00f5es de bits fornecidas pela consulta s\u00e3o claras ou <code>0<\/code>:<\/p>\n<pre><code class=\"language-php\">{ &lt;field&gt; : { $bitsAllClear: &lt;numeric bitmask&gt; } }<\/code><\/pre>\n<pre><code class=\"language-php\">{ &lt;field&gt; : { $bitsAllClear: &lt; BinData bitmask&gt; } }<\/code><\/pre>\n<pre><code class=\"language-php\">{ &lt;field&gt; : { $bitsAllClear: [ &lt;position1&gt; , &lt;position2&gt; , ... ] } }<\/code><\/pre>\n<p>Vamos usar o exemplo usado para <code>$bitsAllSet<\/code> aqui para demonstrar o uso do <code>$bitsAllClear<\/code>. A seguinte consulta usaria este operador para verificar se o campo a tem os bits claros nas posi\u00e7\u00f5es 1 e 5:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { a: { $bitsAllClear: [ 1, 5 ] } } )<\/code><\/pre>\n<p>Esta consulta corresponderia aos seguintes documentos:<\/p>\n<pre><code class=\"language-php\">{ \"_id\" : 2, \"a\" : 20, \"binaryValueofA\" : \"00010100\" }\n{ \"_id\" : 3, \"a\" : 20, \"binaryValueofA\" : \"00010100\" }<\/code><\/pre>\n<h3>Operadores Meta<\/h3>\n<p>H\u00e1 v\u00e1rios modificadores de consulta que permitem modificar o comportamento ou a sa\u00edda de uma consulta no MongoDB. As interfaces do driver podem fornecer m\u00e9todos de cursor que as embrulham para seu uso.<\/p>\n<h4>$hint<\/h4>\n<p>MongoDB depreciado <code>$hint<\/code> desde a v3.2. Mas, este operador ainda pode estar dispon\u00edvel para motoristas do MongoDB como Go, Java, Scala, Ruby, Swift, etc. Ele pode for\u00e7ar o otimizador de consultas a alavancar um \u00edndice espec\u00edfico para preencher a consulta, que pode ent\u00e3o ser mencionado ou por documento, ou por nome do \u00edndice.<\/p>\n<p>Voc\u00ea tamb\u00e9m pode usar o operador <code>$hint<\/code> para testar estrat\u00e9gias de indexa\u00e7\u00e3o e consultar o desempenho. Por exemplo, pegue a seguinte opera\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-php\">db.users.find().hint( { age: 1 } )<\/code><\/pre>\n<p>Esta opera\u00e7\u00e3o devolveria todos os documentos da cole\u00e7\u00e3o chamada <code>users<\/code>, alavancando o \u00edndice no campo <code>age<\/code>.<\/p>\n<p>Voc\u00ea tamb\u00e9m pode mencionar uma dica usando um dos seguintes formul\u00e1rios:<\/p>\n<pre><code class=\"language-php\">db.users.find()._addSpecial( \"$hint\", { age : 1 } )\ndb.users.find( { $query: {}, $hint: { age : 1 } } )<\/code><\/pre>\n<p>Caso existir um filtro de \u00edndice para a forma da consulta, a MongoDB simplesmente ignoraria o <code>$hint<\/code>.<\/p>\n<h4>$comment<\/h4>\n<p>O operador <code>$comment<\/code> permite que voc\u00ea anexe um coment\u00e1rio a uma consulta em qualquer contexto que <code>$query<\/code> possa aparecer. Como os coment\u00e1rios se propagam ao registro de perfil, adicionar um coment\u00e1rio pode facilitar a interpreta\u00e7\u00e3o e o rastreamento do seu perfil.<\/p>\n<p>Voc\u00ea pode alavancar <code>$comment<\/code> em uma das tr\u00eas maneiras:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { &lt;query&gt; } )._addSpecial( \"$comment\", &lt;comment&gt; )\ndb.collection.find( { &lt;query&gt; } ).comment( &lt;comment&gt; )\ndb.collection.find( { $query: { &lt;query&gt; }, $comment: &lt;comment&gt; } )<\/code><\/pre>\n<p>Se voc\u00ea quiser anexar coment\u00e1rios a express\u00f5es de consulta em outros contextos, como com <code>db.collection.update()<\/code>, alavanque o operador de consulta <code>$comment<\/code> ao inv\u00e9s do meta-operador.<\/p>\n<h4>$max<\/h4>\n<p>Voc\u00ea pode mencionar um valor <code>$max<\/code> para especificar o limite superior exclusivo para um determinado \u00edndice para restringir os resultados de <code>find()<\/code>. Este operador especificar\u00e1 o limite superior para todas as chaves de uma ordem espec\u00edfica no \u00edndice.<\/p>\n<p>Mongosh d\u00e1 a voc\u00ea o seguinte m\u00e9todo <code>max()<\/code>:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { &lt;query&gt; } ).max( { field1: &lt;max value&gt; , ... fieldN: &lt;max valueN&gt; } )<\/code><\/pre>\n<p>Voc\u00ea tamb\u00e9m pode mencionar <code>$max<\/code> com os dois formul\u00e1rios a seguir:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { &lt;query&gt; } )._addSpecial( \"$max\", { field1: &lt;max value1&gt; ,\n ... fieldN: &lt;max valueN&gt; } )\ndb.collection.find( { $query: { &lt;query&gt; }, $max: { field1: &lt;max value1&gt; ,\n ... fieldN: &lt;max valueN&gt; } } )<\/code><\/pre>\n<p>Por exemplo, se voc\u00ea quiser especificar o limite superior exclusivo, tenha em mente as seguintes opera\u00e7\u00f5es em uma cole\u00e7\u00e3o chamada cole\u00e7\u00e3o que cont\u00e9m um \u00edndice <code>{ age: 1 }<\/code>:<\/p>\n<pre><code class=\"language-php\">db.collection.find( { &lt;query&gt; } ).max( { age: 100 } ).hint( { age: 1 } )<\/code><\/pre>\n<p>Esta opera\u00e7\u00e3o limitar\u00e1 a consulta \u00e0queles documentos onde a idade do campo \u00e9 inferior a 100 anos e for\u00e7a um plano de consulta que ir\u00e1 digitalizar o \u00edndice <code>{ age: 1 }<\/code> de <code>minKey<\/code> para 100.<\/p>\n<h4>$explain<\/h4>\n<p>Este operador ir\u00e1 lhe dar informa\u00e7\u00f5es sobre o plano de consulta. Ele retorna um documento que descreve os \u00edndices e processos usados para retornar a consulta. Isto pode ser \u00fatil quando se tenta otimizar uma consulta.<\/p>\n<p>Voc\u00ea pode mencionar o operador <code>$explain<\/code> em qualquer uma das seguintes formas:<\/p>\n<pre><code class=\"language-php\">db.collection.find()._addSpecial( \"$explain\", 1 )\ndb.collection.find( { $query: {}, $explain: 1 } )<\/code><\/pre>\n<h2>Melhores pr\u00e1ticas para os Operadores MongoDB<\/h2>\n<p>Nesta se\u00e7\u00e3o, n\u00f3s vamos dar uma olhada em algumas das melhores pr\u00e1ticas enquanto usamos estes operadores MongoDB.<\/p>\n<h3>Integra\u00e7\u00e3o e referenciamento<\/h3>\n<p>A incorpora\u00e7\u00e3o \u00e9 uma extens\u00e3o natural da modelagem de dados. Ele permite que voc\u00ea evite inscri\u00e7\u00f5es, o que pode reduzir atualiza\u00e7\u00f5es e consultas.<\/p>\n<p>Voc\u00ea pode incorporar dados com uma rela\u00e7\u00e3o 1:1 em um \u00fanico documento. Dito isto, dados com um relacionamento muitos: 1 em que &#8220;muitos&#8221; objetos aparecem com seus documentos de origem tamb\u00e9m podem ser bons candidatos.<\/p>\n<p>Armazenar esses tipos de dados no mesmo documento soa como uma escolha prudente. Entretanto, a incorpora\u00e7\u00e3o proporciona um melhor desempenho para opera\u00e7\u00f5es de leitura com este tipo de localidade de dados.<\/p>\n<p>Os modelos de dados incorporados tamb\u00e9m podem ajudar os desenvolvedores a atualizar os dados associados em uma \u00fanica opera\u00e7\u00e3o de grava\u00e7\u00e3o. Isto funciona porque as grava\u00e7\u00f5es de um \u00fanico documento s\u00e3o transacionais.<\/p>\n<p>Voc\u00ea deve considerar o uso de refer\u00eancias para os seguintes cen\u00e1rios:<\/p>\n<ul>\n<li>Quando voc\u00ea atualiza um segmento de documento e ele continua ficando mais longo, enquanto o resto do documento \u00e9 est\u00e1tico.<\/li>\n<li>Quando um documento \u00e9 acessado, mas cont\u00e9m dados que s\u00e3o raramente usados. Incorporar s\u00f3 aumentaria os requisitos de mem\u00f3ria, ent\u00e3o o referenciamento faz mais sentido.<\/li>\n<li>Quando o tamanho do documento ultrapassa o limite de documentos de 16 MB do MongoDB. Isto pode acontecer quando se modelam muitos: 1 relacionamentos (por exemplo, <em>funcion\u00e1rios: departamento<\/em>).<\/li>\n<\/ul>\n<h3>Examine os perfis e padr\u00f5es de consulta<\/h3>\n<p>Para a maioria dos desenvolvedores, o primeiro passo para <a href=\"https:\/\/kinsta.com\/pt\/blog\/ferramentas-teste-desempenho\/\">otimizar o desempenho<\/a> \u00e9 entender os padr\u00f5es de consulta reais e esperados. Uma vez que voc\u00ea conhe\u00e7a bem os padr\u00f5es de consulta do seu aplicativo, voc\u00ea pode fazer seu modelo de dados e escolher os \u00edndices apropriados.<\/p>\n<p>Os desenvolvedores do MongoDB t\u00eam acesso a v\u00e1rias ferramentas poderosas que lhes permitem melhorar o desempenho. Mas isso n\u00e3o significa que perfis e padr\u00f5es de consulta podem ser ignorados.<\/p>\n<p>Por exemplo, uma maneira f\u00e1cil de aumentar o desempenho \u00e9 analisar seus padr\u00f5es de consulta e entender onde voc\u00ea pode incorporar dados. Outras formas de refor\u00e7ar o desempenho do MongoDB ap\u00f3s identificar seus principais padr\u00f5es de consulta incluem:<\/p>\n<ul>\n<li>Certificando-se de que voc\u00ea tenha \u00edndices em quaisquer campos que voc\u00ea consultar.<\/li>\n<li>Armazenando os resultados de subconsultas frequentes em documentos para reduzir a carga de leitura.<\/li>\n<li>Dando uma olhada em seus logs para ver as consultas lentas, e ent\u00e3o verificar seus \u00edndices.<\/li>\n<\/ul>\n<h3>Revis\u00e3o de indexa\u00e7\u00e3o de dados e modelagem<\/h3>\n<p>Ao fazer seu modelo de dados, voc\u00ea estar\u00e1 decidindo como modelar as rela\u00e7\u00f5es entre os dados. Escolher quando incorporar um documento versus criar uma refer\u00eancia em documentos separados em cole\u00e7\u00f5es diferentes, por exemplo, \u00e9 um exemplo de considera\u00e7\u00e3o espec\u00edfica do aplicativo.<\/p>\n<p>Uma grande vantagem dos documentos do JSON \u00e9 que eles permitem aos desenvolvedores modelar os dados com base nos requisitos do aplicativo. Os subdocumentos e matrizes de agrupamento ajudam a modelar rela\u00e7\u00f5es complexas entre os dados, alavancando documentos de texto simples.<\/p>\n<p>Voc\u00ea tamb\u00e9m pode usar o MongoDB para modelar o seguinte:<\/p>\n<ul>\n<li>Dados geoespaciais<\/li>\n<li>Estruturas tabulares, planas e colunares<\/li>\n<li>Pares simples de valores-chave<\/li>\n<li>Dados da s\u00e9rie temporal<\/li>\n<li>Bordas e nodes de estruturas de dados gr\u00e1ficos conectados e similares<\/li>\n<\/ul>\n<h3>Monitoramento de compartilhamento e replica\u00e7\u00e3o<\/h3>\n<p>A replica\u00e7\u00e3o pode ser fundamental para melhorar o desempenho, uma vez que aumenta a disponibilidade de dados atrav\u00e9s de escalas horizontais. A replica\u00e7\u00e3o pode levar a um melhor desempenho e mais seguran\u00e7a atrav\u00e9s da redund\u00e2ncia.<\/p>\n<p>O monitoramento de desempenho pode ser um inc\u00f4modo que requer recursos e tempo adicionais para garantir o bom funcionamento. Voc\u00ea pode aproveitar as ferramentas de monitoramento de desempenho dispon\u00edvel no mercado que atendem \u00e0s suas necessidades espec\u00edficas.<\/p>\n<p>Por exemplo, o <a href=\"https:\/\/kinsta.com\/pt\/ferramenta-apm\/\">Kinsta APM<\/a> pode obter informa\u00e7\u00f5es marcadas no tempo sobre as consultas ao banco de dados MySQL do seu site WordPress, processos PHP, chamadas HTTP externas, e muito mais. Voc\u00ea tamb\u00e9m pode usar esta ferramenta gratuita para depurar:<\/p>\n<ul>\n<li>Chamadas API longas<\/li>\n<li>Solicita\u00e7\u00f5es de URLs externas longas<\/li>\n<li>Consultas lentas de banco de dados para citar algumas.<\/li>\n<\/ul>\n<p>No MongoDB, a replica\u00e7\u00e3o pode ser alcan\u00e7ada por r\u00e9plicas que permitem aos desenvolvedores copiar dados de um node prim\u00e1rio ou servidor atrav\u00e9s de m\u00faltiplos secund\u00e1rios. Isto permite que sua replica\u00e7\u00e3o execute algumas consultas nos secund\u00e1rios ao inv\u00e9s dos prim\u00e1rios, evitando conten\u00e7\u00f5es e levando a um melhor balanceamento de carga.<\/p>\n<p>Os clusters fragmentados em MongoDB s\u00e3o outra forma de melhorar potencialmente o desempenho. Semelhante \u00e0 replica\u00e7\u00e3o, o sharding pode ser usado para distribuir grandes conjuntos de dados em m\u00faltiplos servidores.<\/p>\n<p>Ao aproveitar uma chave de fragmento, os desenvolvedores podem copiar fragmentos ou peda\u00e7os de dados atrav\u00e9s de m\u00faltiplos servidores. Estes servidores podem trabalhar em conjunto para usar todos os dados.<\/p>\n<p>O Sharding tem sua quota-parte de vantagens, incluindo escalonamento horizontal para escritas\/leitura, maior disponibilidade e maior capacidade de armazenamento.<\/p>\n<h3>Determinar o uso de mem\u00f3ria<\/h3>\n<p>MongoDB tem melhor desempenho quando o conjunto de trabalho de um aplicativo (ou seja, dados e \u00edndices frequentemente acessados) cabe na mem\u00f3ria sem problemas. Enquanto outros fatores s\u00e3o fundamentais para o desempenho, o tamanho da RAM \u00e9 o mais importante, por exemplo, o dimensionamento.<\/p>\n<p>Quando o conjunto de trabalho de um aplicativo se encaixa na RAM, a atividade de leitura a partir do disco precisa ser baixa. Mas se seu conjunto de trabalho exceder a RAM do servidor ou tamanho da inst\u00e2ncia, a atividade de leitura come\u00e7ar\u00e1 a disparar.<\/p>\n<p>Caso voc\u00ea vir isso acontecer, voc\u00ea pode conseguir resolver o problema passando para uma inst\u00e2ncia maior que tenha mais mem\u00f3ria.<\/p>\n<h3>Coloque campos de valores m\u00faltiplos no final<\/h3>\n<p>Caso voc\u00ea est\u00e1 indexando alguns campos, e um dos campos que voc\u00ea quer consultar usa um desses operadores &#8220;multi-valores&#8221;, ent\u00e3o voc\u00ea deve coloc\u00e1-los no final do \u00edndice. Voc\u00ea precisa ordenar o \u00edndice para que os campos consultados para valores exatos venham primeiro e os operadores &#8220;multi-valores&#8221; apare\u00e7am em \u00faltimo lugar no \u00edndice.<\/p>\n<p>Uma exce\u00e7\u00e3o a isto seria a classifica\u00e7\u00e3o contra os campos. Coloque estes entre os campos &#8220;multi-valor&#8221; e os campos exatos para cortar a quantidade necess\u00e1ria de ordena\u00e7\u00e3o na mem\u00f3ria.<\/p>\n<h2>Resumo<\/h2>\n<p>Para MongoDB, velocidade \u00e9 o nome do jogo. Para retornar consultas rapidamente, o MongoDB alavanca os operadores para executar tarefas matem\u00e1ticas ou l\u00f3gicas. Simplificando, entender os operadores do MongoDB \u00e9 a chave para dominar o MongoDB.<\/p>\n\n<p>Este artigo destacou alguns dos principais operadores MongoDB que voc\u00ea pode usar em seus dados, como operadores de compara\u00e7\u00e3o, operadores l\u00f3gicos, meta operadores, e operadores de proje\u00e7\u00e3o, para citar alguns. Ele tamb\u00e9m ajuda voc\u00ea a entender como voc\u00ea pode usar os operadores MongoDB e as melhores pr\u00e1ticas que permitir\u00e3o que voc\u00ea obtenha o melhor deles.<\/p>\n<p>Entre todos os operadores, qual(is) voc\u00ea usa com mais frequ\u00eancia, e por qu\u00ea? Compartilhe nos coment\u00e1rios abaixo &#8211; adorar\u00edamos ouvir seus pensamentos!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Em qualquer neg\u00f3cio, os dados s\u00e3o o seu maior ativo. Ao analisar os dados, voc\u00ea pode tomar decis\u00f5es sobre as tend\u00eancias do cliente e a previs\u00e3o &#8230;<\/p>\n","protected":false},"author":117,"featured_media":53170,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[821,219,593,439,736],"topic":[1018],"class_list":["post-53030","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-datab","tag-database","tag-databases","tag-development","tag-mongodb","topic-ferramentas-desenvolvimento-web"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>9 Tipos de Operadores Mongodb que Voc\u00ea Precisa Conhecer - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Este artigo destaca alguns dos principais operadores MongoDB que podem ajud\u00e1-lo a melhorar seu desempenho e mostramos como utiliz\u00e1-los.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"9 Tipos de Operadores Mongodb que Voc\u00ea Precisa Conhecer\" \/>\n<meta property=\"og:description\" content=\"Este artigo destaca alguns dos principais operadores MongoDB que podem ajud\u00e1-lo a melhorar seu desempenho e mostramos como utiliz\u00e1-los.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-19T08:38:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-01-17T13:52:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/09\/operadores-mongodb.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Salman Ravoof\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Este artigo destaca alguns dos principais operadores MongoDB que podem ajud\u00e1-lo a melhorar seu desempenho e mostramos como utiliz\u00e1-los.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/09\/operadores-mongodb.jpeg\" \/>\n<meta name=\"twitter:creator\" content=\"@salmanravoof\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Salman Ravoof\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"37 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/\"},\"author\":{\"name\":\"Salman Ravoof\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\"},\"headline\":\"9 Tipos de Operadores Mongodb que Voc\u00ea Precisa Conhecer\",\"datePublished\":\"2022-09-19T08:38:20+00:00\",\"dateModified\":\"2025-01-17T13:52:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/\"},\"wordCount\":6004,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/09\/operadores-mongodb.jpeg\",\"keywords\":[\"datab\",\"database\",\"databases\",\"development\",\"MongoDB\"],\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/\",\"name\":\"9 Tipos de Operadores Mongodb que Voc\u00ea Precisa Conhecer - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/09\/operadores-mongodb.jpeg\",\"datePublished\":\"2022-09-19T08:38:20+00:00\",\"dateModified\":\"2025-01-17T13:52:08+00:00\",\"description\":\"Este artigo destaca alguns dos principais operadores MongoDB que podem ajud\u00e1-lo a melhorar seu desempenho e mostramos como utiliz\u00e1-los.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/09\/operadores-mongodb.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/09\/operadores-mongodb.jpeg\",\"width\":1460,\"height\":730,\"caption\":\"9 Tipos de Operadores Mongodb que Voc\u00ea Precisa Conhecer\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ferramentas de Desenvolvimento Web\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/ferramentas-desenvolvimento-web\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"9 Tipos de Operadores Mongodb que Voc\u00ea Precisa Conhecer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987\",\"name\":\"Salman Ravoof\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g\",\"caption\":\"Salman Ravoof\"},\"description\":\"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.\",\"sameAs\":[\"https:\/\/salmanravoof.com\",\"https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/\",\"https:\/\/x.com\/salmanravoof\"],\"url\":\"https:\/\/kinsta.com\/pt\/blog\/author\/salmanravoof\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"9 Tipos de Operadores Mongodb que Voc\u00ea Precisa Conhecer - Kinsta\u00ae","description":"Este artigo destaca alguns dos principais operadores MongoDB que podem ajud\u00e1-lo a melhorar seu desempenho e mostramos como utiliz\u00e1-los.","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:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/","og_locale":"pt_PT","og_type":"article","og_title":"9 Tipos de Operadores Mongodb que Voc\u00ea Precisa Conhecer","og_description":"Este artigo destaca alguns dos principais operadores MongoDB que podem ajud\u00e1-lo a melhorar seu desempenho e mostramos como utiliz\u00e1-los.","og_url":"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2022-09-19T08:38:20+00:00","article_modified_time":"2025-01-17T13:52:08+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/09\/operadores-mongodb.jpeg","type":"image\/jpeg"}],"author":"Salman Ravoof","twitter_card":"summary_large_image","twitter_description":"Este artigo destaca alguns dos principais operadores MongoDB que podem ajud\u00e1-lo a melhorar seu desempenho e mostramos como utiliz\u00e1-los.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/09\/operadores-mongodb.jpeg","twitter_creator":"@salmanravoof","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Salman Ravoof","Tempo estimado de leitura":"37 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/"},"author":{"name":"Salman Ravoof","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987"},"headline":"9 Tipos de Operadores Mongodb que Voc\u00ea Precisa Conhecer","datePublished":"2022-09-19T08:38:20+00:00","dateModified":"2025-01-17T13:52:08+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/"},"wordCount":6004,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/09\/operadores-mongodb.jpeg","keywords":["datab","database","databases","development","MongoDB"],"inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/","url":"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/","name":"9 Tipos de Operadores Mongodb que Voc\u00ea Precisa Conhecer - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/09\/operadores-mongodb.jpeg","datePublished":"2022-09-19T08:38:20+00:00","dateModified":"2025-01-17T13:52:08+00:00","description":"Este artigo destaca alguns dos principais operadores MongoDB que podem ajud\u00e1-lo a melhorar seu desempenho e mostramos como utiliz\u00e1-los.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/09\/operadores-mongodb.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/09\/operadores-mongodb.jpeg","width":1460,"height":730,"caption":"9 Tipos de Operadores Mongodb que Voc\u00ea Precisa Conhecer"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/operadores-mongodb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Ferramentas de Desenvolvimento Web","item":"https:\/\/kinsta.com\/pt\/topicos\/ferramentas-desenvolvimento-web\/"},{"@type":"ListItem","position":3,"name":"9 Tipos de Operadores Mongodb que Voc\u00ea Precisa Conhecer"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/9cafd2eedd617e640eeea4cf3a5fd987","name":"Salman Ravoof","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0c5885f75cb78473fb7408e5e49ad190?s=96&d=mm&r=g","caption":"Salman Ravoof"},"description":"Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.","sameAs":["https:\/\/salmanravoof.com","https:\/\/www.linkedin.com\/in\/salman-ravoof-5a749133\/","https:\/\/x.com\/salmanravoof"],"url":"https:\/\/kinsta.com\/pt\/blog\/author\/salmanravoof\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/53030","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/117"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=53030"}],"version-history":[{"count":11,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/53030\/revisions"}],"predecessor-version":[{"id":58802,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/53030\/revisions\/58802"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/53030\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/53030\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/53030\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/53030\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/53030\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/53030\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/53030\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/53030\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/53030\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/53030\/translations\/dk"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/53030\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/53170"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=53030"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=53030"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=53030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}