MongoDB - Consulta em Arrays
Tags: mongodb, beginners, braziliandevs
Published: 2022-07-18 17:38:00

## Tabela de Conteúdos

- [Busca em Arrays](#busca-em-arrays)
- [Busca de Avaliação](#busca-de-avaliação)
- [Links Úteis](#links-úteis)

---

## Busca em Arrays

### O que é?

É a possibilidade de buscar informações dentro de arrays que estão dentro de Documentos, podemos fazer isso através dos Operadores Lógicos e de Comparação, porém existem operadores específicos para tal tarefa, esses que serão abordados logo abaixo.

### Quais são?

De acordo com a [documentação oficial](https://www.mongodb.com/docs/manual/reference/operator/query-array/) existem três operadores que realizam buscas dentro de arrays, são eles: `$all`, `$elemMatch` e `$size`. Cada um deles será explicado melhor logo abaixo.

### Sintaxe

Por se tratar de um operador, a sintaxe básica segue a mesma dos outros operadores, com a única diferença que sempre estaremos buscando um valor dentro de um array, logo todo o campo que desejarmos filtrar deve ser um array.

Dentro de um parâmetro de filtro declaramos o operador e quais valores ele deve buscar, sendo que cada operador irá aceitar o valor em um formato diferente.

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

#### `$all`

- __Função__: retorna todos os Documentos em que o campo pesquisado seja um array com todos os valores definidos no filtro, independente se houver mais elementos ou a ordem estiver diferente.

``` bash
{ foods: { $all: ["burger", "fries"] } }

# retorna todos os Documentos que possuam burger e fries no campo "foods"
```

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

#### `$elemMatch`

- __Função__: retorna todos os Documentos em que o campo pesquisado seja um array com ao menos um valor que satisfaça a condição estabelecida no filtro.

``` bash
{ sales: { $elemMatch: { $gt: 40, $lt: 80 }} }  

# retorna todos os Documentos que possuam ao menos um valor maior que 40 e menor que 80 no campo "sales"
```

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

#### `$size`

- __Função__: retorna todos os Documentos em que o campo pesquisado seja um array com o tamanho especificado.

``` bash
{ tags: { $size: 4 } }  

# retorna todos os Documentos que possuam exatamente 4 elementos dentro do campo "tags"

# não é possível buscar utilizar o $size junto de Operadores de Comparação,
# por exemplo: um array com MAIS DE dois elementos
```

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

---

## Busca de Avaliação

### O que é?

Busca de Avaliação é a tradução livre de Evaluation Query Operators, que de forma simplificada, consiste em operadores que irão _"avaliar"_ um campo específico de acordo com as regras exigidas.

Essa avaliação pode ser interna entre dois, ou mais campos, de um mesmo Documento, ou externa como os operadores vistos anteriormente.

### Quais são?

Existem ao todo seis _Evaluation Query Operators_, porém aqui iremos abordar somente os operadores: `expr`, `$regex` e `$mod`.

### Sintaxe

Cada _Evaluation Query Operators_ possui uma sintaxe muito distinta, então iremos explicar a sintaxe de cada um individualmente.

#### `$expr`

- __Função__: permite a comparação entre dois campos de um mesmo Documento, essa comparação é construída a partir de outros operadores, como os de comparação ou lógicos.

- __Sintaxe__: declaramos o operador `$expr`, em seguida criamos a validação necessária e por fim dizemos os campos a serem comparados através de um array, esses campos devem receber um `$` assim como os operadores.

``` bash
{ $expr: { $gt: ["$credit", "$debit"] } }

# retorna todos os Documentos em que o campo "credit" seja maior que "debit"
```

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

#### `$regex`

- __Função__: permite a pesquisa de textos através de REGEX.

- __Sintaxe__: declaramos o campo que desejamos realizar a busca, em seguida utilizamos o operador `$regex` com a REGEX a ser verificada.

``` bash
{ title: { $regex: /Lord/i } }

# retorna todos os Documentos em que o campo "title" seja válido pela REGEX /lord/i
```

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

#### `$mod`

- __Função__: retorna todos os Documentos em que o campo selecionado dividido pelo valor declarado, resulte no módulo esperado.

- __Sintaxe__: declaramos o campo que desejamos verificar, em seguida utilizamos o operador `$mod` e através de um array declaramos o divisor e o módulo esperado, respectivamente.

``` bash
{ qty: { $mod: [2, 0] } }

# retorna todos os Documentos em que o campo "qty" dividido por 2, tenha um módulo igual a 0
```

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

---

## Links Úteis

- [Array Query Operators](https://www.mongodb.com/docs/manual/reference/operator/query-array/)
- [Query an Array of Embedded Documents](https://www.mongodb.com/docs/manual/tutorial/query-array-of-documents/)
- [Evaluation Query Operators](https://www.mongodb.com/docs/manual/reference/operator/query-evaluation/)
- [Operador `$text`](https://www.mongodb.com/docs/manual/reference/operator/query/text/#match-operation-stemmed-words)