MondoDB - Filter Operators
Tags: mongodb, beginners, braziliandevs
Published: 2022-06-29 20:07:00

## Tabela de Conteúdos

- [Operadores de Comparação](#operadores-de-comparação)
- [Operadores Lógicos](#operadores-lógicos)
- [Método `sort()`](#sort)
- [Removendo Documentos](#removendo-documentos)
- [Links Úteis](#links-úteis)

---

## Operadores de Comparação

### O que são?

São operadores utilizados para a comparação de valores, sendo normalmente aplicados a métodos para leitura, atualização ou exclusão de Documentos.

### Sintaxe

Todos os Operadores de Comparação seguem a mesma estrutura base, indicamos o campo que queremos verificar, seguido do operador junto do valor.

``` bash
{ <campo>: { <operador>: <valor> } }
```

Obs: _Lembrando que esses operadores devem ser aplicados a métodos que suportem a aplicação de filtros, como o `find()`, `countDocuments()` ou o `update()`_.

<br/>

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

### Quais são?

#### `$lt`

- __Tradução__: _Less than_, em português _Menor que_.

O operador irá buscar todos os valores _Menores que_ ...

``` bash
{ age: { $lt: 20 } }  # busca todos os Documentos com a propriedade "age" menor que 20
```

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

#### `$lte`

- __Tradução__:  _Less than or Equal_, em português _Menor ou Igual a_.

O operador irá buscar todos os valores _Menores ou Iguais a_ ...

``` bash
{ price: { $lte: 29 } }  # busca todos os Documentos com a propriedade "price" menor ou igual a 29
```

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

#### `$gt`

- __Tradução__:  _Greater than_, em português _Maior que_.

O operador irá buscar todos os valores _Maiores que_ ...

``` bash
{ age: { $gt: 18 } }  # busca todos os Documentos com a propriedade "age" maior que 18
```

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

#### `$gte`

- __Tradução__:  _Greater than or Equal_, em português _Maior ou Igual a_.

O operador irá buscar todos os valores _Maiores ou Iguais a_ ...

``` bash
{ mana: { $gte: 400 } }  # busca todos os Documentos com a propriedade "mana" maior ou igual a 400
```

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

#### `$eq`

- __Tradução__:  _Equal_, em português _Igual a_.

O operador irá buscar todos os valores _Iguais a_ ...

``` bash
{ _id: { $eq: 2 } }  # busca todos os Documentos com a propriedade "_id" igual a 2
```
``` bash
{ _id: 2 }  # podemos omitir o operador $eq de nosso filtro e o comportamento será o mesmo
```

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

#### `$ne`

- __Tradução__:  _Not Equal_, em português _Diferentes de_.

O operador irá buscar todos os valores _Diferentes de_ ...

``` bash
{ class: { $ne: "Fighter" } }  # busca todos os Documentos com a propriedade "class" diferente de Fighter
```

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

#### `$in`

- __Tradução__:  _In_, em português _Dentro de_.

O operador irá buscar todos os valores _Dentro de_ ...

``` bash
{ country: { $in: ["BR", "USA", "CAN"] } }  # busca todos os Documentos com a propriedade "country" dentro das seguintes opções BR, USA, CAN
```

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

#### `$nin`

- __Tradução__:  _Not In_, em português _Fora de_.

O operador irá buscar todos os valores _Fora de_ ...

``` bash
{ country: { $nin: ["BR", "USA", "CAN"] } }  # busca todos os Documentos com a propriedade "country" fora das seguintes opções BR, USA, CAN
```

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

---

## Operadores Lógicos

### O que são?

Assim como em linguagens de programação, os Operadores Lógicos do MongoDB realizam _"inferências lógicas"_, exemplificando, podemos verificar se a condição `X` __E__ a condição `Y` são verdadeiras, assim como também podemos verificar se ao menos uma delas é verdadeira através do __OU__.

### Sintaxe

Assim como os [Operadores de Comparação](#operadores-de-comparação), os lógicos também devem ser utilizados somente nos métodos que aceitam algum tipo de filtro como parâmetro.

Há duas possíveis estruturas para os Operadores Lógicos, podemos ter uma estrutura simples, no qual não é possível concatenar verificações e estruturas mais complexas que suportam a concatenação de verificações.

O único Operador Lógico que não suporta essa concatenação é o `$not` e sua estrutura consiste em utilizar o operador depois do campo e antes da verificação.

``` bash
# Sintaxe para o operador $not
{ <campo>: { <operador lógico>: { <operador de comparação>: <valor> } } }
```

Já o restante dos Operadores Lógicos suporta a concatenação e sua estrutura é ligeiramente diferente, definimos o Operador a frente de tudo e dentro de um Array adicionamos nossas verificações

``` bash
# Sintaxe para os o restante dos operadores
{ <operador lógico>: [{ <campo>: { <comparador>: <valor> } }, { <campo>: { <comparador>: <valor> } }] }
```

### Quais são?

#### `$not`

- __Tradução__:  _Not_, em português _Não é_.

O operador irá buscar todos os valores que _Não são_ ... / _Não possuem_ ...

``` bash
{ price: { $not: { $gt: 19.99 } } }  # busca todos os Documentos com a propriedade "price" NÃO maior que 19.99

# também busca todos os Documentos que NÃO possuem a propriedade "price"
```

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

#### `$or`

- __Tradução__:  _Or_, em português _Ou_.

O operador irá buscar todos os valores que _Ou é isso, Ou é aquilo_ ...

``` bash
{ $or: [{ promo: true }, { price: { $lt: 19.99 } }] }
# busca todos os documentos que a propriedade "promo" seja verdadeira,
# OU que tenham a propriedade "price" menor que 19.99
```

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

#### `$nor`

- __Tradução__:  _Or not_, em português _Ou não_.

O operador irá buscar todos os valores que _Ou Não é isso, Ou Não é aquilo_ ...

``` bash
{ $nor: [{ promo: true }, { price: { $lt: 19.99 } }] }
# busca todos os documentos que a propriedade "promo" NÃO seja verdadeira,
# OU que propriedade "price" NÃO seja menor que 19.99
```

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

#### `$and`

- __Tradução__:  _AND_, em português _E_.

O operador irá buscar todos os valores que _são isso E aquilo_ ...

``` bash
{ $and: [{ promo: true }, { price: { $lt: 19.99 } }] }
# busca todos os documentos que a propriedade "promo" seja verdadeira,
# E que tenham a propriedade "price" menor que 19.99
```

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

---

## `sort()`

### O que é?

É um método utilizado para ordenar os resultados de uma busca, essa ordenação pode ser numérica, alfabética, crescente ou decrescente.

### Sintaxe

O método `sort()` deve ser utilizado após uma busca, ou seja, deve ser invocado logo após o método `find()`.

O `sort()` aceita _"infinitos"_ parâmetros, esses que devem vir no formato _chave:valor_, onde a chave indica o campo a ser utilizado na ordenação e o valor diz se a ordenação deverá ser crescente ou decrescente.

``` bash
db.my-collection.find().sort({ <campo>: <tipo de ordenação> })
```

``` bash
db.my-collection.find().sort({ price: 1 })  # 1 indica ordenação crescente
db.my-collection.find().sort({ price: -1 })  # -1 indica ordenação decrescente

db.my-collection.find().sort({ price: 1 }, { title: 1 })  # podemos ordenar por mais de um campo
```

<br/>

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

---

## Removendo Documentos

### O que é?

É a forma como podemos deletar um, ou mais, Documentos de nossa Coleção.

### Sintaxe

Temos duas formas de deletarmos Documentos de nossas Coleções, podemos excluir apenas um, ou vários de uma vez. Para ambos os casos a sintaxe é basicamente a mesma, o que irá mudar será apenas o método.

Para removermos um documento iremos invocar o método de deleção desejado, passando para ele um objeto como parâmetro, esse objeto poderá conter apenas uma condição simples, bem como condições mais complexas.

Obs: _Também podemos realizar deleções sem definir um filtro específico, porém isso não é recomendado. (equivalente ao DELETE sem WHERE)._

``` bash
# para deletar apenas um documento utilizamos o deleteOne()

db.my-collection.deleteOne({})  # exclui apenas o primeiro Documento da Coleção
db.my-collection.deleteOne({ _id: 4 })
```

``` bash
# para deletar diversos documentos de uma única vez, utilizamos o deleteMany()

db.my-collection.deleteMany({})  # irá deletar TODOS os Documentos da Coleção
db.my-collection.deleteMany({ qty: 0 })
```

<br/>

<small>[Voltar ao top](#tabela-de-conteúdos)</small>

---

## Links Úteis

- [Ordem de Comparação/Ordenação](https://www.mongodb.com/docs/manual/reference/bson-type-comparison-order/#bson-types-comparison-order)
- [Operadores de Comparação](https://www.mongodb.com/docs/manual/reference/operator/query-comparison/)
- [Operadores Lógicos](https://www.mongodb.com/docs/manual/reference/operator/query-logical/)
- [Métodos de Coleção](https://www.mongodb.com/docs/manual/reference/method/js-collection/)

<br/>

<small>[Voltar ao top](#tabela-de-conteúdos)</small>