# Mongoose

De acordo com uma sondagem que fiz quando pensava em escrever um livro sobre *MEAN stack*, infelizmente não consegui achar o resultado para compartilhar com vocês, fiz no Facebook, em uma comunidade em inglês do *MEAN stack*, **"programador não gosta de ler"**.&#x20;

Infelizmente, acho isso uma pena😌😌 e realmente acho que deveriam ler mais. Um exemplo seria o TDD, que seria um nível de leitura, nesse caso, dos códigos.  Eu também fico ansioso para ver os códigos rodando, mas coloquei na minha cabeça de programar que "a pressa é inimiga da perfeição".&#x20;

Recentemente, tive de "enfrentar" meus supervisores de pós-doutoramento, sempre me apresando; desinstalei o WhatsApp para poder trabalhar, somente assim consegui avançar. Note que de forma alguma estou indo contra a ideia de *Startups*, nesse caso realmente a pressa pode ser melhor, mas seria uma pressa intencional nessa caso, como diz Steve Blank "*get out of the building*" 😂😂😂.&#x20;

{% hint style="info" %}
Tem uma discussão bem legal aqui, que tem haver com essa questão de "velocidade vs. qualidade": "[🚀 DevTernity 2017: Ian Cooper - TDD, Where Did It All Go Wrong](https://www.youtube.com/watch?v=EZ05e7EMOLM\&t=3023s)".

Adicionei como discussão continuada ao nosso curso um vídeo falando dessa palestra, do assunto de TDD vs. Startups, **seriam ideias antagônicas**?&#x20;
{% endhint %}

![](/files/-Mdh_2q3Lr65QBnxjqHP)

Refiro-me a uma pressa sem necessidade, sem compromisso com algo, somente para terminar logo. Lembrei-me de uma imagem que infelizmente não salvei, vi no *Facebook*, achar isso vai ser pior do que achar algo no meu computador.&#x20;

Basicamente, se comparavam um doutor com um programador: o programar pensava em desisti no primeiro obstáculo, ao passo que o doutorado se leva anos para se terminar.

{% hint style="info" %}
&#x20;"Ensinar programação é um desafio porque programação, como eu vejo é “10% de inspiração e 90% de transpiração.” Usando Thomas Edison como ponto de argumentação. Posso ensinar o básico. Como disse Cal Newport, professor do MIT em programação, em [Deep Work](https://www.amazon.com.br/Deep-Work-Focused-Success-Distracted/dp/1455586692), agora aprender virou o mais importante no mundo, em especial no mundo da [#programação](https://www.linkedin.com/feed/hashtag/?keywords=programa%C3%A7%C3%A3o\&highlightedUpdateUrns=urn%3Ali%3Aactivity%3A6810554764221276160) onde tudo muda muito rápido." fonte: [meu perfil](https://www.linkedin.com/posts/jorgeguerrapires_jorge-guerra-jardim-guanabara-aprenda-activity-6810554764221276160-QTl5) no Linkedin
{% endhint %}

{% hint style="info" %}
Para os que gostam do conceito de *startups*, além do conteúdo desse curso, também estudei o conceito de startups no meu pós-doutoramento, com foco ao sistema de saúde. Ver [Alguns insights em Startups em Healthcare](https://www.youtube.com/watch?v=Ek36DmikYP0).&#x20;
{% endhint %}

Conversa à parte, vamos falar do *Mongoose*.

{% hint style="info" %}
Mongoose foi criado pela mesma empresa do MongoDB. O objetivo do Mongoose é oferecer uma forma de se modelar os dados dentro da aplicação, sem necessariamente perder a flexibilidade do MongoDB.&#x20;
{% endhint %}

{% hint style="info" %}
"Mongoose cria uma forma direta, focada em esquemas, para se modelar os dados da sua aplicação. Isso inclui funções como tipos embutidos, validação, pedidos, e mais " \[tradução livre]

Fonte: <https://mongoosejs.com/>
{% endhint %}

## Modelagem de dados

No contexto do Mongoose, modelagem de dados é quando se defini o que estará em um banco de dados, e como estará, ou seja, os pormenores. Você pode definir nesse processo informações como o tipo do dado, se é obrigatório, limites numéricos...fazemos isso no curso, contudo,  de forma não exaustiva; a documentação oficial oferece muitos outros exemplos que tornariam o curso muito longo e com risco de se perder o foco. Uma das consequências desse processo, e fazemos isso no curso, é que o próprio Mongoose, usando o esquema, filtra o que será salvo. Considere um cenário de `req.body` cheio de informações inúteis, somente o que bate com a modelagem será salvo.&#x20;

{% hint style="info" %}
Fazendo um *spoiler,* o NestJS agora vem com formas mas elegantes de se trabalhar com o `req.body.`&#x20;
{% endhint %}

{% hint style="success" %}
Ver aula 17 "Fazendo nosso primeiro teste com Jest, part 2"  (35:42). Fiz um corte [aqui](https://www.youtube.com/watch?v=vSpDF5AuGR0).
{% endhint %}

{% hint style="info" %}
Vamos usar a notação yy:xx para designar o ponto no vídeo que estamos nos referindo, onde yy é o minuto, e xx os segundos.&#x20;
{% endhint %}

```javascript
//nosso esquema para gatos fofinhos 
const kittySchema = new mongoose.Schema({
    name: String
});
```

No esquema acima, declaramos para o Mongoose que queremos que os gatos tenham nome, somente isso.&#x20;

### Testando se salva algo que não existe no esquema

Testamos no curso o cenário de tentarmos salvar a idade, isso falha!

```javascript
    it('Estamos testando se é salvo no esquema algo que não existe', () => {
        const age = 10;
        const silence = new Kitten({ age });
        expect(silence.age).toBeUndefined();
    })
})

```

{% hint style="info" %}
Jest Matcher usado [`toBeUndefined()`](https://jestjs.io/docs/expect#tobeundefined)
{% endhint %}

{% hint style="info" %}
Fonte [aqui](https://github.com/JorgeGuerraPires/curso-mongoose/tree/module_4).&#x20;
{% endhint %}

![Visão esquemática de como funciona o Mongoose. Fonte: adaptado de Simon\&Cliver (2019).  ](/files/-Md9IMqOmvpdE4ZXiL3t)

#### O que o Mongoose oferece?

* Facilidade na criação de conexões múltiplas. Isso facilita usar o fato de que o MongoDB é *escalável horizontalmente*;
* Facilidade na criação de métodos personalizados para se manipular os atributos dos esquemas, abordado no curso;
* Métodos embutidos para se facilitar atividades padrão como salvar;
* Formas de se conectar diferentes documentos, ver o conceito de *populate* [aqui](https://www.youtube.com/watch?v=IBZSnb2dxFs);
* Métodos embutidos para validação dos atributos e sistema de mensagens que avisam de erros;
* Outros;

{% hint style="info" %}
"MongoDB é uma excelente escolha para muitas aplicações web porque oferece o balanço entre velocidade dos bancos de dados puramente baseados em documentos e e o poder de bancos de dados relacionais" \[tradução livre] Simon\&Cliver (2019).
{% endhint %}

É isso aí pessoal, a melhor forma de se aprender é colocando a mão na massa!! Bons estudos!&#x20;

&#x20;

![Bons estudos!](/files/-MdBjhQw4fvMKH1jYb6g)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://jorgeguerrabrazil-github.gitbook.io/curso-no-mongoose/teoria-faz-bem-para-saude/mongoose.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
