Ao realizar consultas (queries) no MongoDB, você con­se­guirá encontrar e analisar dados de forma rápida e eficaz. A estrutura lógica desse método permite a uti­li­za­ção de inúmeros pa­râ­me­tros para es­pe­ci­fi­car so­li­ci­ta­ções, o que configura sua grande vantagem. Não perca tempo e aprenda a consultar dados com o nosso tutorial MongoDB queries.

MongoDB queries para realizar consultas

Como um sistema NoSQL baseado em do­cu­men­tos, o MongoDB permite que você armazene e gerencie grandes volumes de dados, de diversos tipos, de uma forma bastante simples. Esse sistema de ge­ren­ci­a­mento de banco de dados (DBMS) é querido e popular jus­ta­mente por sua fle­xi­bi­li­dade e pela fa­ci­li­dade que ele tem de se expandir ho­ri­zon­tal­mente.

Di­fe­ren­te­mente do que ocorre em bancos de dados re­la­ci­o­nais, no MongoDB os dados são ar­ma­ze­na­dos em do­cu­men­tos BSON (JSON binário) e agrupados em coleções. Assim, para que funcione de verdade, a solução deve oferecer me­ca­nis­mos de consulta poderosos, capazes de filtrar as in­for­ma­ções ar­ma­ze­na­das e apre­sen­tar somente as realmente ne­ces­sá­rias. Ao realizar MongoDB queries, você consegue consultar até mesmo coleções am­pla­mente ra­mi­fi­ca­das, obtendo as in­for­ma­ções que deseja.

Dica

Quer trabalhar com o MongoDB, mas tem di­fi­cul­dade de mexer com o shell? Conheça o MongoDB Compass, a interface gráfica de usuário gratuita desse sistema de banco de dados.

O que são consultas?

Consultas nada mais são que pesquisas es­tru­tu­ra­das de dados complexos. Elas seguem regras lógicas e funcionam como outros filtros co­nhe­ci­dos, como filtros de sites. No MongoDB, queries permitem que você execute buscas precisas para obter os melhores re­sul­ta­dos possíveis, es­pe­ci­al­mente porque a solução armazena di­fe­ren­tes tipos de dados em seus bancos. Se não ofe­re­cesse uma poderosa fer­ra­menta de consulta, o MongoDB não seria um sistema de ge­ren­ci­a­mento tão popular. Para aprender a realizar consultas no MongoDB, siga as nossas ins­tru­ções.

Pré-re­qui­si­tos para realizar consultas no MongoDB

Para usar o método MongoDB queries, você terá de se atentar a alguns re­qui­si­tos básicos:

  1. Pri­mei­ra­mente, o MongoDB deve estar instalado no seu com­pu­ta­dor. Seus bancos de dados são com­pa­tí­veis com di­fe­ren­tes sistemas ope­ra­ci­o­nais, então, para fins deste tutorial, não interessa se você usa Linux, OS X ou Windows, já que o passo a passo após a ins­ta­la­ção é o mesmo em todos os sistemas, pois são exe­cu­ta­dos dentro do sistema de banco de dados. Aprenda a instalar e mexer na solução com o tutorial in­tro­du­tó­rio ao MongoDB do nosso Digital Guide.
  2. Você também precisará de direitos ad­mi­nis­tra­ti­vos para realizar consultas no MongoDB.
  3. Re­co­men­da­mos que você crie um ambiente de teste ini­ci­al­mente, para que possa testar o método sem colocar seus bancos de dados em risco.

Assim que cumprir os pré-re­qui­si­tos, você já poderá começar a consultar.

Criar coleção de teste

Abra o terminal e faça login no MongoDB com as suas cre­den­ci­ais de ad­mi­nis­tra­dor. Em seguida, crie uma nova coleção, que servirá como ambiente de teste para as suas primeiras consultas. Como o método não considera somente do­cu­men­tos simples, mas também arrays, di­fe­ren­tes campos e do­cu­men­tos in­cor­po­ra­dos, criaremos uma coleção de exemplo um pouco mais complexa, capaz de de­mons­trar as vastas pos­si­bi­li­da­des do método MongoDB queries.

No nosso exemplo, ela­bo­ra­mos uma lista de clientes com os seguintes dados:

{
    "name" : "Schulz",
    "units" : 642,
    "location" : [ "Germany", "Austria" ],
    "transactions" : {
        "first" : {
            "year" : 2017,
        },
        "last" : {
            "year" : 2023,
        },
        "total" : 14
    }
}
shell

Mais es­pe­ci­fi­ca­mente, os dados fazem re­fe­rên­cia a:

  • name: O nome do da empresa que adquiriu nossos produtos.
  • units: O número total de produtos comprados pela empresa.
  • location: O endereço da empresa. Caso haja várias filiais, elas podem ser ar­ma­ze­na­das como um array.
  • tran­sac­ti­ons: Esse campo contém do­cu­men­tos in­cor­po­ra­dos (embedded documents ou nested documents). Cada um desses do­cu­men­tos cor­res­ponde a uma transação, contendo in­for­ma­ções sobre a primeira compra (“first”), sobre a última compra (“last”) e sobre o total de compras re­a­li­za­das (“total”).

No exemplo, in­cor­po­ra­mos do­cu­men­tos para que mais in­for­ma­ções possam ser adi­ci­o­na­das pos­te­ri­or­mente, a fim de mantermos a or­ga­ni­za­ção dos dados.

Criar coleção de teste para realizar consultas

Agora, criaremos uma nova coleção de teste, que daremos o nome de “clients”. Para que o exemplo fique mais claro, adi­ci­o­na­re­mos somente cinco entradas à coleção. Contudo, ao trabalhar com o MongoDB, você terá toda a liberdade de criar coleções bem mais extensas. Para criarmos a coleção que desejamos, usaremos o método in­sert­Many:

db.clients.insertMany ( [
{
    "name" : "Schulz",
    "units" : 642,
    "location" : [ "Germany", "Austria" ],
    "transactions" : {
        "first" : {
            "year" : 2017,
        },
        "last" : {
            "year" : 2023,
        },
        "total" : 14
    }
},
{
    "name" : "ATS",
    "units" : 17,
    "location" : "France",
    "transactions" : {
        "first" : {
            "year" : 2021,
        },
        "last" : {
            "year" : 2022,
        },
        "total" : 2,
    }
},
{
    "name" : "Meyer",
    "units" : 814,
    "location" : [ "Austria", "Germany" ],
    "transactions" : {
        "first" : {
            "year" : 2016,
        },
        "last" : {
            "year" : 2023,
        },
        "total" : 22,
    }
},
{
    "name" : "Jones",
    "units" : 313,
    "location" : [ "Germany", "United States" ],
    "transactions" : {
            "first" : {
            "year" : 2017,
            },
        "last" : {
            "year" : 2020,
        },
        "total" : 9,
    }
},
{
    "name" : "Lopes",
    "units" : 7,
    "location" : "Paraguai",
    "transactions" : {
        "first" : {
            "year" : 2022,
        },
        "last" : {
            "year" : 2023,
        },
        "total" : 2,
    }
}
] )
shell

Se você executar o código com as entradas acima, receberá, como resultado, uma lista contendo os IDs dos objetos as­so­ci­a­dos. Estes valores são ex­clu­si­vos e sempre fazem re­fe­rên­cia a um único documento. Para garantir que todos os do­cu­men­tos sejam trans­fe­ri­dos para a coleção que deseja, você pode fazer uso do método MongoDB find, seguido de pa­râ­me­tros adi­ci­o­nais:

db.clients.find ( )
shell

A saída cor­res­pon­derá a uma lista contendo todos os IDs de objetos com os do­cu­men­tos completos. Consulte-a com o MongoDB queries.

Consultar campos es­pe­cí­fi­cos com o MongoDB queries

O resultado exibido pelo exemplo anterior já prova a im­por­tân­cia do método MongoDB queries. Mesmo neste nosso pequeno exemplo, a saída produzida apre­sen­tou longas cadeias de ca­rac­te­res, o que di­fi­cul­ta­ria a análise desses dados. Assim, ado­ta­re­mos o método find para melhor es­pe­ci­fi­car­mos a nossa consulta. Para tanto, es­ta­be­le­ce­re­mos um requisito es­pe­cí­fico, que deve ser cumprido pelo documento de saída. No exemplo a seguir, buscamos por todos os do­cu­men­tos com o nome “ATS”:

db.clients.find (
    { "name" : "ATS" }
)
shell

Uma consulta simples como essa é capaz de realizar buscas em todos os do­cu­men­tos ar­ma­ze­na­dos na coleção que indica, para encontrar aqueles que possuem o valor “ATS”. Como este valor está presente em somente uma entrada da coleção, a seguinte saída foi apre­sen­tada:

db.clients.find ( { "name" : "ATS" } )
{
    "_id" : ObjectID ( "673d14684o75iftbb0ct5003" ),
    "name" : "ATS",
    "units" : 17,
    "location" : "France",
    "transactions" : {
        "first" : {
            "year" : 2021,
        },
        "last" : {
            "year" : 2022,
        },
        "total" : 2
    }
shell

O caminho oposto também fun­ci­o­na­ria: para obtermos todos os re­sul­ta­dos, exceto a entrada que cor­res­ponde ao valor “ATS”, bastaria que in­se­rís­se­mos a seguinte entrada (ela exibirá um resultado bastante extenso):

db.clientes.find (
    { "name" : { $ne : "ATS" } }
)
shell

Se você quiser, contudo, executar consultas no MongoDB com valores di­fe­ren­tes, terá de usar um array. No nosso exemplo, so­li­ci­ta­mos que os clientes “ATS” e “Lopes” fossem con­si­de­ra­dos:

db.clients.find (
    { "name" : [ $in : [ "ATS", "Lopes" ] } }
)
shell

Consultar vários campos com o MongoDB queries

Quando você desejar obter re­sul­ta­dos realmente precisos, deverá es­pe­ci­fi­car melhor a sua consulta. Insira pa­râ­me­tros adi­ci­o­nais ao método MongoDB queries para uma maior precisão. No exemplo, se além do valor “ATS”, que cor­res­ponde ao nome da empresa, es­pe­ci­fi­car­mos um valor para “units”, o documento re­sul­tante será aquele que contiver ambos os valores:

db.clients.find (
    { "name" : "ATS", "units" : 17 }
)
shell

Esse resultado é, mais uma vez, uma cor­res­pon­dên­cia exata. No entanto, se um dos dois valores não estivesse correto, nenhum resultado seria retornado. A seguinte entrada, por exemplo, não obteria sucesso:

db.clients.find (
    { "name" : "ATS", "units" : 25 }
)
shell

Se, ao con­si­de­rar di­fe­ren­tes valores em uma consulta, você desejar obter não somente os re­sul­ta­dos que atendam a todas as condições, mas também os que atendem a somente uma delas, proceda da seguinte forma:

db.clients.find (
    { $or : [ {"name" : "ATS"}, { "units" : 25 } ] }
)
shell

Consultar valores em arrays com o MongoDB queries

O MongoDB queries também consulta valores em arrays. No nosso exemplo, que contém empresas com filiais em vários países, desejamos obter os clientes que possuem pelo menos uma filial na Alemanha. Para tanto, exe­cu­ta­mos a seguinte consulta:

db.clients.find (
    { "location" : "Germany" }
)
shell

A saída inclui os três clientes que têm pelo menos uma filial na Alemanha. Para expandir a consulta e obter os clientes com filiais na Alemanha e na Áustria, por exemplo, or­ga­ni­za­mos um array:

db.clients.find (
    { "location" : [ "Germany", "Austria" ] }
)
shell

Note, contudo, que essa entrada exibe somente um resultado, embora, te­o­ri­ca­mente, duas empresas atendam aos critérios de busca. O motivo para que isso ocorra é o seguinte: consultas no MongoDB con­si­de­ram entradas exatas e, portanto, levam em conta a ordem das in­for­ma­ções. Para con­si­de­rar valores presentes em qualquer local de um array, com­ple­mente a consulta da seguinte maneira:

db.clients.find (
    { "location" : { $all : [ "Germany", "Austria" ] } }
)
shell

MongoDB queries em do­cu­men­tos in­cor­po­ra­dos

Nosso exemplo de coleção também contém do­cu­men­tos in­cor­po­ra­dos, que podem ser igual­mente con­sul­ta­dos com o método MongoDB queries. Para fazer isso, você deverá incluir um ponto na entrada, que si­na­li­zará ao MongoDB que os campos de um documento in­cor­po­rado também devem ser ana­li­sa­dos. Para listar todos os clientes que re­a­li­za­ram mais de 10 tran­sa­ções, por exemplo, exe­cu­ta­mos o seguinte código:

db.clients.find (
    { "transactions.total" : { $gt : 10 } }
)
shell

O MongoDB acessará o documento “tran­sac­ti­ons” e con­si­de­rará o número total de tran­sa­ções (“total”).

MongoDB queries para limitar re­sul­ta­dos

Re­sul­ta­dos de consultas, no MongoDB, costumam ser bastante extensos, mesmo com a uti­li­za­ção de métodos de es­pe­ci­fi­ca­ção. Assim, pode ser útil que você aprenda a limitar saídas a apenas alguns campos. Para fazer isso, utilize projeções. Elas podem conter os valores 1 (incluir campos) e 0 (excluir campos). No exemplo abaixo, re­a­li­za­mos uma consulta em duas partes. Pri­mei­ra­mente, iniciamos uma busca sem pa­râ­me­tros, para a inclusão de todas as in­for­ma­ções. Em seguida, ordenamos a re­a­li­za­ção de uma projeção para con­si­de­rar apenas o campo do nome.

db.clients.find (
    { }
    { "name" : 1 }
)
shell

Dessa forma, obtivemos todos os re­sul­ta­dos com­pa­tí­veis limitando as saídas aos nomes cor­res­pon­den­tes.

Cursores para otimizar re­sul­ta­dos

Faça uso de cursores para melhor organizar a apre­sen­ta­ção dos re­sul­ta­dos das suas consultas. Eles permitem, entre outras coisas, limitar o número de saídas e alterar a ordem delas. Para exibir apenas dois dos re­sul­ta­dos en­con­tra­dos, por exemplo, adotamos o método limit. Ele funciona assim:

db.clients.find (
    { }
    { "name" : 1 }
).limit ( 2 )
shell

Com a seguinte es­pe­ci­fi­ca­ção, você ordenará a exibição dos re­sul­ta­dos, so­li­ci­tando que somente os três clientes com o menor número de pedidos sejam exibidos:

db.clients.find (
    { }
    { "name" : 1 }
).limit ( 2 ) .sort ( { "units" : 1 } )
shell
Dica

Para encontrar um documento es­pe­cí­fico no seu banco de dados de forma mais di­re­ci­o­nada, adote o método MongoDB findOne. Aprenda a usá-lo com o nosso artigo es­pe­ci­a­li­zado.

Ir para o menu principal