Introdução ao MongoDB
Tags: beginners, mongodb, braziliandevs
Published: 2022-06-20 20:54:14

## Tabela de Conteúdos

- [Estrutura do MongoDB](#estrutura-do-mongodb)
- [Bancos de Dados](#bancos-de-dados)
- [Coleções](#coleções)
- [Documentos](#documentos)
- [Regras](#regras)
- [`InsertOne`](#insertone)
- [`InsertMany`](#insertmany)
- [`Find`](#find)
- [Operadores de Comparação](#operadores-de-comparação)
- [Links Úteis](#links-úteis)

---

## Estrutura do MongoDB

### Classe

#### O que é?

Apesar de serem englobados dentro de um mesmo escopo, os banco de dados NoSQL possuem diferentes tipos de armazenamento, em outras palavras, são de __classes__ diferentes.

#### Document

Não iremos abordar todos os tipo de classe NoSQL aqui, iremos focar apenas na classe do MongoDB, Document.

A classe Document é a mais flexível dentre todas, seu formato de armazenamento é similar ao JSON, no MongoDB por exemplo, esse formato é chamado de BSON. De forma prática iremos armazenar os dados no formato de um _"Objeto JavaScript"_, onde temos `chave:valor`, sendo que cada valor poderá conter outro objeto e assim sucessivamente.

### Qual é?

A estrutura _"interna"_ do MongoDB consiste em três partes, que serão explicadas logo abaixo, são elas: os [Bancos de Dados](), as [Coleções]() e os [Documentos]().

<br />

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

---

## Bancos de Dados

### O que são?

Assim como em DB relacionais, os NoSQL podem possuir mais de um banco de dados cada, ou seja, é onde iremos armazenar as _Coleções_.

A maior diferença entre Bancos de Dados SQL e MongoDB <small>_(além do funcionamento interno)_</small> é a capacidade de se _"auto criar"_ um novo Banco de Dados conforme a necessidade, ou seja, ao realizarmos uma operação em um Banco de Dados que ainda não existe, ele será criado de forma automática para nós, incluindo a operação que acabamos de fazer.

<br />

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

---

## Coleções

### O que são?

Fazendo um paralelo aos DB relacionais, as Coleções seriam equivalentes as Tabelas, que por sua vez seriam responsáveis por armazenar _Documentos_.

<br />

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

---

## Documentos

### O que são?

São equivalentes as entidades de um DB relacional, o que seria armazenado em uma linha da Tabela, irá ser armazenado como um objeto BSON dentro da Coleção.

<br />

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

---

## Regras

### O que são?

São restrições aplicadas a criação de Tables/Collections e inserção de dados através de Entity/Document.

### SQL x MongoDB

Diferente de Tabelas e Entidades dos bancos de dados relacionais, as Coleções e Documentos de um banco de dados como o MongoDB podem ser completamente livres de regras, logo podemos ter dentro de uma mesma Coleção, Documentos com estruturas extremamente diferentes.

Apesar de isso ser possível e não gerar nenhum tipo de erro interno no DB, ainda temos a opção de _"regrar"_ a criação de Documentos, sendo que essa regra deverá ocorrer em nível de Documento e não de Coleção.

__Obs__: _Podemos aplicar regras em níveis de Coleção, porém caso já existam Documentos salvos, as regras podem impactá-los._

### Regrando

Para adicionar as restrições na criação de um novo documento utilizamos o `Schema Validation`, recurso nativo do MongoDB, esse que não será abordado aqui, porém a documentação é bem didática em sua explicação.

[Documentação - Schema Validation](https://www.mongodb.com/docs/manual/core/schema-validation/)

<br />

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

---

## `InsertOne()`

### O que é?

É um comando do MongoDB que permite a inserção de um novo Documento a uma Coleção, essa que não precisa existir previamente.

### Sintaxe

A sintaxe desse comando é, de certa forma, similar a do JavaScript, mas não se engane, é um comando para ser utilizado no mongo shell (mongosh).

Para executarmos esse comando precisamos ter previamente selecionado um banco de dados do MongoDB, após isso utilizamos a palavra reservada `db`, seguida da Coleção a receber o Documento e por fim o comando `insertOne()` recebendo por parâmetro, em forma de Objeto _(JSON)_, as informações do Documento.


``` bash
use <nome do banco de dados>
db.<nome da coleção>.insertOne({ });
```

``` bash
use my-database
db.user.insertOne({ "name": "Gabriel", "age": 21 });
```

<br />

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

---

## `InsertMany()`

### O que é?

É um comando para a inserção de múltiplos valores dentro de uma Coleção, sendo que por padrão esses valores são inseridos de forma ordenada, porém podemos alterar esse comportamento.

Quando inseridos de forma ordenada, os Documentos podem sofrer uma _"parada"_ na inserção caso ocorra algum erro, dessa forma apenas os Documentos antes do erro ter ocorrido serão inseridos. Porém caso optemos por inserir de forma não ordenada, todos os Documentos que não gerarem erro serão inseridos, por mais que outros gerem.

### Sintaxe

Esse comando é extremamente similar ao `insertOne`, com a única diferença que iremos passar nossos Documentos dentro de um Array.

``` bash
use <nome do banco de dados>
db.<nome da coleção>.insertMany([{ }, { }]);
```

``` bash
use my-database
db.user.insertMany([{ "name": "Gabriel", "age": 21 }, { "name": "Daniela", "age": 23 }]);
```

<br />

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

---

## `Find()`

### O que é?

É um comando para a pesquisa de Documentos, onde podemos aplicar filtros de busca, bem como definir o formato de retorno da busca.

### Sintaxe

Assim como os comandos vistos anteriormente, esse também irá seguir uma sintaxe similar, utilizando o `db` seguido da Coleção e indicando o comando `find()` ao final, porém o comando em si pode receber até dois argumentos, sendo ambos em formato de JSON.

O primeiro argumento é um filtro de busca no qual pesquisamos os Documentos através de seus campos, para isso utilizamos um JSON, definindo a chave a ser usada no filtro e qual valor ela deverá ter.

O segundo argumento é uma _"modelagem"_ do Documento encontrado, dessa forma podemos definir os campos que queremos que sejam retornados, ou ocultados, da busca realizada. Para definir que um campo deve ser retornado usamos seu nome seguido do número `1` e caso desejarmos ocultá-lo usamos o número `0`.

``` bash
use <nome do banco de dados>

db.<nome da coleção>.find();  # retorna todos os Documentos
db.<nome da coleção>.find({ });  # define apenas o "filtro"
db.<nome da coleção>.find({ }, { });  # define o "filtro" e o formato do retorno
```

``` bash
use my-database

db.my-database.find();
db.my-database.find({ });
db.my-database.find({ }, { });
```

<br />

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

---

## Operadores de Comparação

### O que são?

Como o nome diz, são operadores que realizam comparações entre os valores, normalmente utilizados para a criação de filtros.

### Sintaxe

Os Operadores de Comparação do MongoDB nada mais são do que _"chaves reservadas"_, logo tudo que precisamos fazer é passar a chave para a comparação desejada e o valor a ser comparado.

A lista de chaves de comparação do MongoDB é relativamente extensa, então ela não será abordada aqui, porém recomendo a consulta da [documentação](https://www.mongodb.com/docs/manual/reference/operator/query-comparison/).

Por fim para aplicarmos os Operadores de Comparação, basta escolhermos uma ação a ser feita como, pesquisa `find` por exemplo, e dentro do parâmetro de filtro utilizar os operadores.

``` bash
use <nome do banco de dados>

db.<nome da coleção>.find({ });
```

``` bash
use my-database

db.my-database.find({ age: { $gt: 18 } });  # busca todos os Documentos que tenha a idade maior que 18
```

<br />

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

---

## Links Úteis

- [Devo usar NoSQL e MongoDB?](https://medium.com/leroy-merlin-brasil-tech/devo-usar-nosql-e-mongodb-951693aa0d34) por [Zizaco Zizuini](https://medium.com/@zizacozizaco)
- [`db.createCollection()`](https://www.mongodb.com/docs/manual/reference/method/db.createCollection/#db.createCollection)
- [Schema Validation](https://www.mongodb.com/docs/manual/core/schema-validation/)
- [Operadores de Comparação](https://www.mongodb.com/docs/manual/reference/operator/query-comparison/)
- [Projection Operators](https://www.mongodb.com/docs/manual/reference/operator/projection/)

<br />

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