Consultas MongoDB: como funcionam as consultas de dados
Com as consultas do MongoDB (também chamadas de queries), pode pesquisar e analisar a sua base de dados de forma rápida e eficaz. A estrutura do método é muito lógica e permite utilizar parâmetros para restringir as consultas.
Pesquisa eficaz em coleções
O MongoDB é uma solução documental NoSQL com a qual é possível armazenar e gerir facilmente grandes quantidades de dados diversos. O sistema de gestão de bases de dados é muito flexível e tem uma escalabilidade horizontal simples.
Ao contrário das bases de dados relacionais, neste caso os dados são armazenados em documentos BSON (JSON binário) e agrupados em coleções. No entanto, para que isso ocorra, são necessários mecanismos de consulta poderosos que possam filtrar a base de dados e apresentar apenas as informações necessárias. Essas consultas do MongoDB pesquisam até mesmo em coleções complexas e fornecem as informações procuradas.
Você acha confuso usar o MongoDB através do Shell? Nesse caso, a interface gráfica de usuário gratuita MongoDB Compass facilita as coisas para você.
O que são consultas MongoDB?
O MongoDB queries é uma ferramenta intuitiva que serve para pesquisar em estruturas de dados complexas. Segue regras lógicas e funciona como as opções de filtro de muitas páginas web, pelo que é possível realizar uma pesquisa muito restrita e obter os melhores resultados. Isto é especialmente importante, uma vez que o MongoDB permite armazenar muitos tipos diferentes de dados e, se não existissem as opções de filtragem necessárias, seria difícil gerir uma base de dados. A seguir, explicamos passo a passo como criar facilmente consultas no MongoDB e como utilizá-las.
Quais são os requisitos para usar as consultas MongoDB?
Para utilizar as consultas MongoDB, são necessários apenas alguns requisitos.
- Primeiro, deve instalar o MongoDB no seu computador. A base de dados funciona em muitos sistemas operativos, pelo que pode seguir estas instruções com Linux, OS X ou Windows. Os passos após a instalação são os mesmos em todos os sistemas e afetam apenas a própria base de dados. No nosso tutorial do MongoDB pode ler como funciona a instalação.
- Para utilizar a função de pesquisa, é necessário ter direitos de administrador.
- O melhor é criar um ambiente de teste para utilizar o método pela primeira vez sem riscos. A seguir, explicamos quais passos seguir.
Estrutura de uma coleção de teste
Primeiro, abra o Shell e inicie sessão com os seus dados de administrador. Em seguida, crie uma nova coleção, que servirá como ambiente de teste para realizar as suas primeiras consultas MongoDB. O método não leva em consideração apenas documentos simples, mas também matrizes, vários campos e documentos incorporados. Para demonstrar o alcance das consultas MongoDB, vamos criar uma coleção um pouco mais complexa.
Como exemplo, vamos ter uma lista de clientes. O formato deve ser o seguinte:
{
"name" : "Sanz",
"units" : 642,
"location" : [ "Germany", "Austria" ],
"transactions" : {
"first" : {
"year" : 2017,
},
"last" : {
"year" : 2023,
},
"total" : 14
}
}shellEste documento contém as seguintes informações:
- name: o nome da empresa do cliente que vendeu a mercadoria.
- unidades: a quantidade total de produtos que a empresa encomendou.
- localização: a sede da outra empresa. Se houver mais filiais, estas podem ser guardadas na forma de matriz.
- transactions: este campo contém agora outro documento que é incorporado ou aninhado (em inglês, fala-se de «embedded documents» ou «nested documents»). Cada documento de transação contém informações sobre o tempo que a empresa é cliente (no ponto «first»), quando foi feito o último pedido (no ponto «last») e, por último, quantas vezes fez pedidos (no ponto «total»).
Neste caso, os documentos adicionais foram incluídos para poder adicionar mais informações posteriormente. Assim, os dados continuam organizados.
Criação da coleção de teste para as consultas MongoDB
Agora vamos criar uma coleção chamada «Clientes», que no nosso exemplo deve conter apenas cinco entradas para uma melhor organização. Se mais tarde quiser utilizar consultas MongoDB de forma profissional, poderá criar coleções muito mais extensas através do método insertMany. Assim ficaria o nosso exemplo:
db.clientes.insertMany ( [
{
"name" : "Sanz",
"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" : "Murillo",
"units" : 814,
"location" : [ "Austria", "Germany" ],
"transactions" : {
"first" : {
"year" : 2016,
},
"last" : {
"year" : 2023,
},
"total" : 22,
}
},
{
"name" : "Pawolski",
"units" : 313,
"location" : [ "Germany", "Poland" ],
"transactions" : {
"first" : {
"year" : 2017,
},
"last" : {
"year" : 2020,
},
"total" : 9,
}
},
{
"name" : "Jorgensen",
"units" : 7,
"location" : "Dinamarca",
"transactions" : {
"first" : {
"year" : 2022,
},
"last" : {
"year" : 2023,
},
"total" : 2,
}
}
] )shellSe copiar esta entrada ou preenchê-la com os seus próprios dados, receberá uma lista dos IDs de objeto atribuídos. Estes são únicos e garantem que cada documento também possa ser encontrado através do ID. Se quiser garantir que todos os documentos foram transferidos para a coleção, pode utilizar o MongoDB find em vez de continuar a introduzir parâmetros adicionais:
db.clientes.find ( )shellComo resultado, obtém-se uma lista de todos os Object ID com os documentos completos, que agora poderá explorar com consultas MongoDB.
Consultar campos individuais com consultas MongoDB
Este resultado por si só destaca o valor acrescentado oferecido pelas consultas MongoDB. Mesmo no nosso pequeno exemplo, o resultado terá longas cadeias de caracteres, o que, no mínimo, dificultará muito a sua análise se não tiver outras ferramentas. Por isso, a seguir, também utilizaremos o método find, mas especificando a pesquisa. Para isso, vamos definir um requisito especial que um documento deve cumprir para aparecer nos resultados. No nosso exemplo, procuramos todos os documentos cujo nome corresponda ao valor «ATS». Deve ficar assim:
db.clientes.find (
{ "name" : "ATS" }
)shellAs consultas MongoDB simples deste tipo procuram agora todos os documentos armazenados na coleção correspondente e mostram as correspondências com o valor do nome «ATS». Na nossa coleção, existe apenas uma entrada com este valor, pelo que o resultado será o seguinte:
db.clientes.find ( { "name" : "ATS" } )
{
"_id" : ObjectID ( "673d14684o75iftbb0ct5003" ),
"name" : "ATS",
"units" : 17,
"location" : "France",
"transactions" : {
"first" : {
"year" : 2021,
},
"last" : {
"year" : 2022,
},
"total" : 2
}shellTambém é possível fazer o contrário. Se quiser mostrar todos os resultados, exceto a entrada com «ATS», escreva da seguinte forma:
db.clientes.find (
{ "name" : { $ne : "ATS" } }
)shellSe quiser gerar consultas MongoDB com valores diferentes, também pode fazê-lo com uma matriz. No nosso exemplo, introduzimos os clientes «ATS» e «Jorgensen».
db.clientes.find (
{ "name" : [ $in : [ "ATS", "Jorgensen" ] } }
)shellConsultar vários campos com consultas MongoDB
Se precisar de resultados muito precisos, é importante restringir ainda mais a consulta. Para isso, pode especificar as consultas MongoDB utilizando parâmetros adicionais. Se agora fizermos uma consulta especificando o valor do segmento «units» (unidades), além do nome da empresa «ATS», será procurado um documento que contenha ambos os valores:
db.clientes.find (
{ "name" : "ATS", "units" : 17 }
)shellNeste caso, obtém-se novamente uma correspondência exata. No entanto, se um dos dois valores não tiver correspondências, não será obtido nenhum resultado. Por exemplo, esta entrada não teria resultados:
db.clientes.find (
{ "name" : "ATS", "units" : 25 }
)shellNo entanto, se quiser utilizar consultas MongoDB para considerar diferentes valores, mas quiser que a entrada seja feita apenas quando pelo menos um dos requisitos for cumprido, introduza o seguinte:
db.clientes.find (
{ $or : [ {"name" : "ATS"}, { "units" : 25 } ] }
)shellConsultar valores em matrizes
Os valores das matrizes também podem ser considerados nas consultas do MongoDB. No nosso caso, há empresas que têm filiais em vários países. Por exemplo, pode obter todos os clientes que têm pelo menos uma filial na Alemanha:
db.clientes.find (
{ "location" : "Germany" }
)shellO resultado agora contém os três clientes que têm pelo menos uma filial na Alemanha. No entanto, se quiser expandir a entrada e recuperar os clientes com filiais na Alemanha e também na Áustria, deve utilizar uma matriz:
db.clientes.find (
{ "location" : [ "Germany", "Austria" ] }
)shellComo pode observar, obtém-se apenas um resultado, embora, em teoria, duas empresas correspondam aos critérios de pesquisa. Isto deve-se ao facto de as consultas MongoDB terem em conta a entrada exata e, portanto, neste caso, a ordem. No entanto, se quiser obter valores que podem estar em qualquer ordem numa matriz, faça a consulta desta forma:
db.clientes.find (
{ "location" : { $all : [ "Germany", "Austria" ] } }
)shellConsultas MongoDB para documentos incorporados
No nosso exemplo, também utilizámos documentos incorporados (ou documentos aninhados). Estes também podem aparecer nos resultados ao utilizar consultas MongoDB. Para isso, é necessário adicionar um ponto para indicar ao MongoDB que os campos de um documento incorporado devem ser analisados. Por exemplo, se precisar de uma lista dos clientes que têm mais de dez transações de encomenda, introduza o seguinte:
db.clientes.find (
{ "transactions.total" : { $gt : 10 } }
)shellO MongoDB acede ao documento «transactions» e, em seguida, considera o número total de transações de encomendas.
Consultas MongoDB: limitar o resultado
Mesmo depois de aprender os métodos mencionados, é possível que os resultados obtidos com as consultas MongoDB pareçam muito extensos. Talvez queira limitar o resultado a alguns campos. Para isso, utilizam-se as chamadas projeções, que contêm o valor 1 (para campos incluídos) e 0 (para campos que devem ser excluídos). No exemplo a seguir, vamos realizar uma consulta em duas partes. Primeiro, inicia-se uma pesquisa sem parâmetros que conteria todas as informações. Imediatamente depois, realiza-se uma projeção que leva em consideração apenas o campo do nome.
db.clientes.find (
{ }
{ "name" : 1 }
)shellAssim, pode obter todos os dados, mas o resultado será limitado aos nomes correspondentes.
Utilizar cursores para otimizar o resultado
Os cursores são métodos que não controlam os resultados das consultas do MongoDB em si, mas personalizam a sua visualização. Por exemplo, pode limitar o número de resultados ou alterar a sua ordem. Se quiser mostrar apenas dois dos resultados, deve utilizar o método limit. Funciona assim:
db.clientes.find (
{ }
{ "name" : 1 }
).limit ( 2 )shellCom o seguinte comando, pode ordenar o resultado e obter os três clientes que menos produtos encomendaram:
db.clientes.find (
{ }
{ "name" : 1 }
).limit ( 2 ) .sort ( { "units" : 1 } )shellPara encontrar um documento específico na sua base de dados, existe o método MongoDB findONE. Explicamos isso com mais detalhes em outro artigo.