top of page

Como fazer queries no MongoDB utilizando o find

  • Foto do escritor: Rodrigo Saito
    Rodrigo Saito
  • 17 de mar.
  • 4 min de leitura

Sabemos que no MongoDB, as collections são formadas por JSON, e o método find é o que deve ser utilizado.


Para este teste, é necessário que voce já tenha o MongoDB configurado em seu docker Desktop, e que o MongoDB Compass já esteja configurado para acessar o seu container.


Inicie o seu MongoDB no Docker Desktop:


Inicializacao do container MongoDB
Inicializacao do container MongoDB

Conecte ao MongoDB Compass

Conexao com o MongoDB Compass
Conexao com o MongoDB Compass

Será necessário fazer a criação de um novo banco de dados. Abra o MongoDB Shell e digite o seguinte comando:

use exemploFind
Criação de um banco de dados não existente
Criação de um banco de dados não existente

Copie os dados do JSON que está no GitHub, para que você possa fazer a inserção dos dados:



Dê o seguinte comando:

Inserção de dados em massa
Inserção de dados em massa

Após ter executado o comando, será dado o seguinte retorno:

Inserção de 1000 registros
Inserção de 1000 registros

Clique nos três pontos da conexão do host, e depois clique em [Refresh databases]

Refresh em cima da conexão local
Refresh em cima da conexão local

Veja o banco de dados criado, com a collection "car":

Novo banco de dados e collection sendo exibidos
Novo banco de dados e collection sendo exibidos

Abra o prompt do _Mongosh e digite o primeiro comando, para que todos os registros sejam exibidos:


Dez primeiros registros sendo exibidos da collection car
Dez primeiros registros sendo exibidos da collection car

O Mongo irá mostrar os 10 primeiros registros.


Para continuar a ser exibidos, digite it

it
Comando it para continuar sendo exibidos os demais registros
Comando it para continuar sendo exibidos os demais registros

Até o momento, não estamos filtrando nada, trazendo todos os objetos.


Primeira querie com condição


Vamos executar o seguinte comando, passando um parâmetro que um campo deverá ser igual ao parâmetro passado:


db.car.find({fabricante : 'BMW'})
Filtro por fabricante
Filtro por fabricante

O prompt é uma excelente ferramenta para execução de comandos, porém o MongoDB Compass oferece uma melhor visualização dos dados:


Clique em cima da collection "cars" e veja que do lado direito, aparece uma barra com uma espécie de filtro. Será onde iremos utilizar para os nossos exemplos.

Pesquisa a ser feita via MongoDB Compass
Pesquisa a ser feita via MongoDB Compass

Podemos agora, colocar os filtros e ver o resultado quase em tempo real. Coloque o mesmo filtro dado na linha de comando anterior e veja o resultado:


{fabricante : 'BMW'}
Filtro aplicado para fabricante iguais a BMW
Filtro aplicado para fabricante iguais a BMW

Troque pelo filtro "Toyota"

{ fabricante: "Toyota" }
Filtro do Fabricante iguais a Toyota
Filtro do Fabricante iguais a Toyota

E agora coloque "toyota" com a primeira letra t minuscula

{ fabricante: "toyota" }

Toyota com t minusculo, não retorna resultado
Toyota com t minusculo, não retorna resultado

Perceba que não irá aparecer nenhum resultado, pois o MongoDB é Case Sensitive;


O MongoDB suporta Regex, igual aos das linguagens de programação.


Para que não tenhamos problemas de Caso Sensitivo (maiusculo e minusculo fazendo diferença nos retornos das pesquisas), vamos utilizar o aproximado do regex [Regular Expression] (como se fosse o like do sql)


O i no final do comando é de "ignore case"


{ fabricante: /toyota/i }
Pesquisa sendo usado Regex (Regular Expression)
Pesquisa sendo usado Regex (Regular Expression)

Pesquisa com duas ou mais condições


Podemos fazer a pesquisa filtrar mais registros, contendo 2 ou mais condições. Coloque dessa forma o filtro:

{ fabricante: /toyota/i, pais: "China" }
Pesquisa com 2 parametros
Pesquisa com 2 parametros

Estamos colocando que toyota pode ser uma procura aproximada e China tem que ser uma procura exata (estando entre aspas)


Pesquisa com < ($lt), >($gt), <= ($lte) e >= ($gte)


Para utilizar os operados <, >, <= e >= é necessário colocar por abreviação e não por símbolos. Complemente o comando anterior para:

{ fabricante: /toyota/i, pais: "China", ano: {$gt: 2000} }
Pesquisa utilizando o $gt
Pesquisa utilizando o $gt

Lembre-se que estamos usando o operador $gt (greater than) ou maior que.

Caso eu queira incluir o ano de 2000 também no filtro, é necessário usar o operador $gte

{ fabricante: /toyota/i, pais: "China", ano: {$gte: 2000} }
Pesquisa utilizando o $gte
Pesquisa utilizando o $gte

No caso de tipo de dados com números, podemos fazer uma espécie de between do SQL, complementando o comando:


{ fabricante: /toyota/i, pais: "China", ano: {$gte: 2000, $lte: 2004} }
Pesquisa utilizando o $gte e $lte
Pesquisa utilizando o $gte e $lte

Até agora, vimos que as condições são somadas uma as outras, como se fossem o AND do SQL.


Vamos ver como trabalhamos com o OR


Pesquisa com $or


Nesse caso, queremos que seja pesquisado 2 marcas de carro, sendo BMW ou Toyota. Podemos fazer da seguinte forma:


{ $or: [{fabricante: 'BMW'}, {fabricante: 'Toyota'}] }
Pesquisa utilizando o $or
Pesquisa utilizando o $or

Observe que o comando precisa ser colocado entre [ ] (abre e fecha colchetes), o que indica que temos um vetor.



Nesse caso anterior, estamos usando o mesmo campo a ser filtrado por 2 valores, servindo 1 ou outro, mas o mais comum seria usar outro campo como referencia. Por exemplo:


{ $or: [{fabricante: 'BMW'}, {cidade: 'China'}] }

Utilizando $or com campos diferentes
Utilizando $or com campos diferentes

Quando temos casos de um mesmo campo, podemos usar a pesquisa por elementos $in


{ {fabricante: {$in : ['BMW', 'Suzuki']}}
Utilizacao do $in
Utilizacao do $in

Procura por elementos de vetores.


Para fazer essa procura, vamos ter que criar uma nova collection no mesmo banco de dados, que contém um vetor. Dê o seguinte comando para fazer a inserção de dados:


db.produto.insertOne({codigo: 1, descricao: 'Camiseta', tamanho:'M', cor: ['branco','azul','amarelo'], preco: 49.99 });
db.produto.insertOne({codigo: 2, descricao: 'Bermuda', tamanho:'G', cor: ['verde','branco','cinza'], preco: 37.90 });
db.produto.insertOne({codigo: 3, descricao: 'Calça Jeans', tamanho:'P', cor: ['azul','branco','preto'], preco: 99.90 });
db.produto.insertOne({codigo: 4, descricao: 'Calça Moleton', tamanho:'G', cor: ['cinza','branco'], preco: 75.25 });
db.produto.insertOne({codigo: 5, descricao: 'Camisa Manga Longa', tamanho:'M', cor: ['branco','preto'], preco: 89.75 });
db.produto.insertOne({codigo: 6, descricao: 'Camisa Manga Curta', tamanho:'G', cor: ['azul','amarelo'], preco: 59.90 });
db.produto.insertOne({codigo: 7, descricao: 'Camisa Manga Longa', tamanho:'G', cor: ['verde','preto'], preco: 99.90 });

Supondo que queremos que as cores branco e preto estejam no vetor, digite o seguinte comando:

{cor : {$all:['branco','preto']}}
Pesquisa utilizando o $all
Pesquisa utilizando o $all

Podemos também utilizar os que não tem nenhum atributo das cores no vetor:

{cor : {$nin:['branco','preto']}}
Pesquisa utilizando o $nin (not in)
Pesquisa utilizando o $nin (not in)

Ainda é possível fazer outras pesquisas, como contadores, média, máximo, mínimo e outros, porém será visto em outro blog.


obrigado, e até +!




 
 
 

Comments


Nunca perca um post. Assine agora!

Caso queira receber noticias sobre o blog, assine!

© 2022 por datalib

  • Ícone do Facebook Cinza
  • Ícone do Linkedin Cinza
bottom of page