Como fazer queries no MongoDB utilizando o find
- 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:

Conecte ao 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

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

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

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

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

Abra o prompt do _Mongosh e digite o primeiro comando, para que todos os registros sejam exibidos:
db.car.find()

O Mongo irá mostrar os 10 primeiros registros.
Para continuar a ser exibidos, digite it
it

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:

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.

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'}

Troque pelo filtro "Toyota"
{ fabricante: "Toyota" }

E agora coloque "toyota" com a primeira letra t minuscula
{ fabricante: "toyota" }

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 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" }

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} }

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} }

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} }

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'}] }

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'}] }

Quando temos casos de um mesmo campo, podemos usar a pesquisa por elementos $in
{ {fabricante: {$in : ['BMW', 'Suzuki']}}

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']}}

Podemos também utilizar os que não tem nenhum atributo das cores no vetor:
{cor : {$nin:['branco','preto']}}

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