<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gabriel_Silvestre</title>
    <description>The latest articles on DEV Community by Gabriel_Silvestre (@gabrielhsilvestre).</description>
    <link>https://dev.to/gabrielhsilvestre</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F786008%2F161ff19a-8bce-42dc-982f-77b9accb58d3.jpeg</url>
      <title>DEV Community: Gabriel_Silvestre</title>
      <link>https://dev.to/gabrielhsilvestre</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gabrielhsilvestre"/>
    <language>en</language>
    <item>
      <title>Introdução MCP</title>
      <dc:creator>Gabriel_Silvestre</dc:creator>
      <pubDate>Thu, 27 Mar 2025 20:08:01 +0000</pubDate>
      <link>https://dev.to/gabrielhsilvestre/introducao-mcp-1b47</link>
      <guid>https://dev.to/gabrielhsilvestre/introducao-mcp-1b47</guid>
      <description>&lt;h2&gt;
  
  
  MCP
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;O MCP é um protocolo de comunicação open-source que padroniza a forma pela qual aplicações provém contexto e disponibilizam ferramentas as LLMs. As aplicações por sua vez podem se conectar a N servidores, permitindo uma maior variedade de contexto e de capacidades.&lt;/p&gt;

&lt;p&gt;Sua arquitetura segue o modelo &lt;em&gt;client-server&lt;/em&gt;, sendo seus principais componentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP Hosts&lt;/strong&gt; -&amp;gt; Aplicações que irão consumir o conteúdo e utilizar as ferramentas disponbilizadas via MCP &lt;em&gt;(Ex: Claude Desktop, IDEs ou AI &lt;a href="https://dev.toTODO__adicionar"&gt;Tools&lt;/a&gt;)&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Clients&lt;/strong&gt; -&amp;gt; Protocolo responsável pela manutenção e conexão 1:1 com o servidor &lt;em&gt;(1 aplicação = N clients:N servers)&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Servers&lt;/strong&gt; -&amp;gt; Programa &lt;strong&gt;leve&lt;/strong&gt; que irá expor os recursos e capacidades do MCP previamente configurados;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Porque usar?
&lt;/h3&gt;

&lt;p&gt;De acordo com a própria &lt;a href="https://modelcontextprotocol.io/introduction#why-mcp%3F" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;: &lt;em&gt;"O MCP ajuda a construir agentes e worflows complexos integrados com IA, uma vez que LLMs frequentemente precisam de uma forma de se conectar a diferentes fontes de dados para contexto e ferramentas para executar ações. E o que o MCP prove?"&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Uma crescente lista de integrações "pré-construídas" que podem ser ligadas diretamente a sua aplicação&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Flexibilidade para alterar entre diferentes provedores de LLMs&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;As melhores práticas para proteger seus dados, dentro da sua infraestrutura&lt;/em&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Como usar?
&lt;/h3&gt;

&lt;p&gt;É possível construir &lt;code&gt;clients&lt;/code&gt; e &lt;code&gt;servers&lt;/code&gt; a partir de SDKs disponíveis para diferentes linguagens.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/modelcontextprotocol/python-sdk" rel="noopener noreferrer"&gt;Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/modelcontextprotocol/typescript-sdk" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/modelcontextprotocol/java-sdk" rel="noopener noreferrer"&gt;Java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/modelcontextprotocol/kotlin-sdk" rel="noopener noreferrer"&gt;Kotlin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Comunicação Interna
&lt;/h3&gt;

&lt;p&gt;Como explicado anteriormente, o MCP é constituído de 3 partes principais &lt;code&gt;Hosts&lt;/code&gt;, &lt;code&gt;Clients&lt;/code&gt; e &lt;code&gt;Servers&lt;/code&gt;. Essas partes se comunicam através de diferentes tipos de mensagens, que por sua vez são enviadas e recebidas através do &lt;code&gt;Protocol Layer&lt;/code&gt; e do &lt;code&gt;Transport Layer&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Protocol layer
&lt;/h4&gt;

&lt;p&gt;Camada responsável pelo recebimento e tratamento das mensagens trocadas entre &lt;code&gt;client&lt;/code&gt; e &lt;code&gt;server&lt;/code&gt;. Funciona de forma similar ao modelo &lt;code&gt;request/response&lt;/code&gt; do HTTP.&lt;/p&gt;

&lt;h4&gt;
  
  
  Transport layer
&lt;/h4&gt;

&lt;p&gt;Camada responsável pela real comunicação entre o &lt;code&gt;client&lt;/code&gt; e o &lt;code&gt;server&lt;/code&gt;. Utiliza &lt;a href="https://www.jsonrpc.org" rel="noopener noreferrer"&gt;JSON-RPC&lt;/a&gt; 2.0 para comunicação e segue seguinte &lt;a href="https://spec.modelcontextprotocol.io/specification/2024-11-05/" rel="noopener noreferrer"&gt;especificação&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O MCP suporta 2 formas de comunicação nativamente, &lt;code&gt;stdio&lt;/code&gt; que consiste em termos simples na leitura e execução do arquivo contendo a configuração do &lt;code&gt;server&lt;/code&gt; pelo próprio &lt;code&gt;client&lt;/code&gt;, útil para processamento local e para operações que exijam leitura e escrita. E também suporta nativamente a comunicação via &lt;code&gt;HTTP/SSE&lt;/code&gt; para os casos onde o &lt;code&gt;server&lt;/code&gt; ficará disponível de forma remota.&lt;/p&gt;

&lt;p&gt;Além disso o MCP também permite a implementação de &lt;a href="https://modelcontextprotocol.io/docs/concepts/transports#custom-transports" rel="noopener noreferrer"&gt;&lt;code&gt;transports&lt;/code&gt; customizados&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Message types
&lt;/h4&gt;

&lt;p&gt;O MCP possui 4 tipos de mensagens:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request&lt;/strong&gt; - Mensagem que espera uma resposta;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;params&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt; - Mensagem de resposta a solicitação de &lt;code&gt;Request&lt;/code&gt;;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Result&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Error&lt;/strong&gt; - Indica que algo falhou;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nb"&gt;Error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Notification&lt;/strong&gt; - Mensagens de sentido único, não esperam resposta;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Notification&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;params&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;Os &lt;code&gt;resources&lt;/code&gt; são um &lt;em&gt;componente primitivo&lt;/em&gt; no MCP, sendo responsáveis pela exposição de dados ao &lt;code&gt;client&lt;/code&gt;. Dados esses que podem ser textos, ou binários &lt;em&gt;(que possam ser convertidos em base64)&lt;/em&gt; e serão lidos pelo usuário e/ou usados de contexto para LLMs.&lt;/p&gt;

&lt;p&gt;Os &lt;code&gt;resources&lt;/code&gt; foram criados para serem controlados pela aplicação &lt;em&gt;(&lt;code&gt;host&lt;/code&gt;)&lt;/em&gt;, dessa forma diferentes aplicações lidam com os dados de formas diferentes, sendo assim é essencial que o &lt;code&gt;server&lt;/code&gt; esteja apito a fornecer acesso a recursos de diferentes maneiras. &lt;a href="https://modelcontextprotocol.io/docs/concepts/resources" rel="noopener noreferrer"&gt;Por exemplo &lt;em&gt;(com a própria documentação)&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;O Claude Desktop exige que o usuário selecione explicitamente os recursos que serão consumidos pela LLM&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Outras aplicaçãoes podem escolher de forma pré-definida alguns recursos&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;E por fim, pode ser que a própria LLM escolha quais recursos irá usar&lt;/em&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Entre as maneiras de acesso estão a forma direta, acessando um &lt;code&gt;resource&lt;/code&gt; através de sua URI, e a forma dinâmica através de templates de URI. A URI por sua vez é a forma de identificação de um recurso, sendo estruturada da seguinte forma &lt;code&gt;[protocol]://[host]/[path]&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://modelcontextprotocol.io/docs/concepts/resources#example-implementation" rel="noopener noreferrer"&gt;Exemplo &lt;em&gt;(da própria documentação)&lt;/em&gt;&lt;/a&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;example-server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// List available resources&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ListResourcesRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;file:///logs/app.log&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Application Logs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;mimeType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/plain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Read resource contents&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ReadResourceRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uri&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uri&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;file:///logs/app.log&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;logContents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;readLogFile&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;mimeType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/plain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;logContents&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Resource not found&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Prompts
&lt;/h3&gt;

&lt;p&gt;Os &lt;code&gt;prompts&lt;/code&gt; permitem definir no &lt;code&gt;server&lt;/code&gt; templates de prompts reutilizáveis, bem como workflows que podem ser acionados pelo usuário, ou pela LLM, através do &lt;code&gt;client&lt;/code&gt;. Um &lt;code&gt;prompt&lt;/code&gt; pode aceitar argumentos dinâmicos, incluir contexto de &lt;code&gt;resources&lt;/code&gt;, encadear múltiplas interações e guiar o usuário/LLM através de workflows.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://modelcontextprotocol.io/docs/concepts/prompts#example-implementation" rel="noopener noreferrer"&gt;Exemplo &lt;em&gt;(da própria documentação)&lt;/em&gt;&lt;/a&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Server&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/sdk/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ListPromptsRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;GetPromptRequestSchema&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/sdk/types&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PROMPTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;git-commit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;git-commit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Generate a Git commit message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;changes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Git diff or description of changes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;explain-code&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;explain-code&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Explain how code works&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;code&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Code to explain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;language&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Programming language&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;example-prompts-server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;prompts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// List available prompts&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ListPromptsRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;prompts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PROMPTS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Get specific prompt&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;GetPromptRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;PROMPTS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Prompt not found: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;git-commit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Generate a concise but descriptive commit message for these changes:\n\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;changes&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;explain-code&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;language&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;language&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unknown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Explain how this &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;language&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; code works:\n\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Prompt implementation not found&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tools
&lt;/h3&gt;

&lt;p&gt;As &lt;code&gt;tools&lt;/code&gt; permitem que as LLMs executem ações de forma quase 100% autonoma, apenas com a necessidade de um humano no fluxo por questão de design. Através das &lt;code&gt;tools&lt;/code&gt; é possível realizar qualquer ação desde que ela retorne uma resposta.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://modelcontextprotocol.io/docs/concepts/tools#implementing-tools" rel="noopener noreferrer"&gt;Exemplo &lt;em&gt;(da própria documentação)&lt;/em&gt;&lt;/a&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;example-server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Define available tools&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ListToolsRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;calculate_sum&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Add two numbers together&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;inputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;b&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}]&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Handle tool execution&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CallToolRequestSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;calculate_sum&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tool not found&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Introdução as HOFs - .some() e .every()</title>
      <dc:creator>Gabriel_Silvestre</dc:creator>
      <pubDate>Fri, 11 Nov 2022 00:56:54 +0000</pubDate>
      <link>https://dev.to/gabrielhsilvestre/introducao-as-hofs-some-e-every-3a3b</link>
      <guid>https://dev.to/gabrielhsilvestre/introducao-as-hofs-some-e-every-3a3b</guid>
      <description>&lt;h2&gt;
  
  
  Tabela de Conteúdo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;some&lt;/li&gt;
&lt;li&gt;every&lt;/li&gt;
&lt;li&gt;Links Úteis&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  .some()
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que faz?
&lt;/h3&gt;

&lt;p&gt;A HOF &lt;code&gt;.some()&lt;/code&gt; irá verificar se ao menos um elemento do Array cumpre as condições estabelecidas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[❌] Modifica o Array original&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;O &lt;code&gt;callback&lt;/code&gt; esperado deve retornar &lt;code&gt;true&lt;/code&gt; ou &lt;code&gt;false&lt;/code&gt;, para que então se possa fazer as verificações.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;.some()&lt;/code&gt; irá iterar sobre o Array até que um elemento cumpra a condição passada, retornando &lt;code&gt;true&lt;/code&gt;. Caso nenhum elemento cumpra a condição, o &lt;code&gt;.some()&lt;/code&gt; retornará &lt;code&gt;false&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;some&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;some&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// verifica se ao menos um elemento é maior do que 10&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;haveSomeGreaterThanTen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;some&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="c1"&gt;// verifica se ao menos um número é maior do que 10&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;haveSomeGreaterThanTen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tradução - JavaScript -&amp;gt; Português
&lt;/h3&gt;

&lt;p&gt;Podemos traduzir essa HOF com a seguinte expressão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“Existe pelo menos um elemento que cumpre X condição?”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  .every()
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que faz?
&lt;/h3&gt;

&lt;p&gt;A HOF &lt;code&gt;.every()&lt;/code&gt; irá verificar se todos os elementos do Array cumprem as condições estabelecidas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[❌] Modifica o Array original&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;O &lt;code&gt;callback&lt;/code&gt; esperado deve retornar &lt;code&gt;true&lt;/code&gt; ou &lt;code&gt;false&lt;/code&gt;, para que então se possa fazer as verificações.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;.every()&lt;/code&gt; irá iterar por todo o Array verificando se todos os elementos cumprem a condição passada, retornando &lt;code&gt;true&lt;/code&gt;. Caso algum elemento não cumpra a condição, o &lt;code&gt;.every()&lt;/code&gt; retornará &lt;code&gt;false&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;every&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;every&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;every&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// verifica se todos os elemento são maiores do que 10&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;São Paulo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rio de Janeiro&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Curitiba&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;areAllCitiesString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;every&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// verifica se todas as cidades são do tipo string&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;areAllCitiesString&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tradução - JavaScript -&amp;gt; Português
&lt;/h3&gt;

&lt;p&gt;Podemos traduzir essa HOF com a seguinte expressão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“Todos os elementos cumprem X condição?”.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links Úteis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  .some()
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some"&gt;Documentação MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/jsref/jsref_some.asp"&gt;Documentação W3Schools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=GXpBfDW4lT8"&gt;YouTube Tecnologia em Vídeo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  .every()
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every"&gt;Documentação MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/jsref/jsref_every.asp"&gt;Documentação W3Schools&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>braziliandevs</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>Introdução as HOFs - .forEach() e .sort()</title>
      <dc:creator>Gabriel_Silvestre</dc:creator>
      <pubDate>Wed, 09 Nov 2022 00:06:23 +0000</pubDate>
      <link>https://dev.to/gabrielhsilvestre/introducao-as-hofs-foreach-e-sort-3a3g</link>
      <guid>https://dev.to/gabrielhsilvestre/introducao-as-hofs-foreach-e-sort-3a3g</guid>
      <description>&lt;h2&gt;
  
  
  Tabela de Conteúdo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;forEach&lt;/li&gt;
&lt;li&gt;sort&lt;/li&gt;
&lt;li&gt;Links Úteis&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  .forEach()
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que faz?
&lt;/h3&gt;

&lt;p&gt;Itera sobre todos os elementos do array, possibilitando a manipulação desses valores, porém não retorna valor algum. Ou seja, podemos adicionar propriedades a objetos, adicionar eventListeners a elementos HTML e até mesmo trocar um valor por outro.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[✔] Modifica o Array original&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Essa HOF, assim como todas as outras, espera uma callback como parâmetro, sendo que essa callback, por sua vez, poderá receber até três parâmetros: o elemento; o índice; e o Array que foi iterado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;someArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* someCallback */&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;someArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt;

&lt;span class="nx"&gt;someArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// imprime no console, um a um, todos os elementos do Array&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;trem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;car&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;monster&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nx"&gt;toys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;toy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;toy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// coloca todos os brinquedos em caixa alta.&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toys&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ["TREM", "CAR", "MONSTER"];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tradução - JavaScript -&amp;gt; Português
&lt;/h3&gt;

&lt;p&gt;Podemos traduzir essa HOF com a seguinte expressão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“Para cada elemento, faça X coisa.”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  .sort()
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que faz?
&lt;/h3&gt;

&lt;p&gt;Ordena o array de acordo com o critério estabelecido, por padrão essa função já possui um critério próprio, que é utilizado quando não passamos uma callback através dos parâmetros.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[✔] Modifica o Array original&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Essa HOF espera uma callback que recebe apenas dois parâmetros, sendo eles os valores a serem comparados na hora de ordenar o array. Diferente de outras HOFs, aqui não temos acesso ao índice ou ao array que estamos iterando.&lt;/p&gt;

&lt;p&gt;O callback deve retornar um número positivo, negativo ou neutro (zero), a partir desse número o .sort irá alocar o elemento para frente ou para trás.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;someArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;someArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* someCallback */&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;someArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{});&lt;/span&gt;

&lt;span class="nx"&gt;someArray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// *O algorítimo de ordenação "padrão" do .sort() não é muito confiável&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// [10, 13, 2, 21, 32]&lt;/span&gt;

&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Ordena de forma crescente&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// [2, 10, 13, 21, 32]&lt;/span&gt;

&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Ordena de forma decrescente&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// [32, 21, 13, 10, 2]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tradução - JavaScript -&amp;gt; Português
&lt;/h3&gt;

&lt;p&gt;Podemos traduzir essa HOF com a seguinte expressão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“Ordene esse array de acordo com X condição.”.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links Úteis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  .forEach()
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach"&gt;Documentação MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/jsref/jsref_foreach.asp"&gt;Documentação W3Schools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=E4In5QhNYHw"&gt;YouTube Tecnologia em Vídeo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  .sort()
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort"&gt;Documentação MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.w3schools.com/jsref/jsref_sort.asp"&gt;Documentação W3Schools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=qVKSb0OPQPQ"&gt;YouTube Tecnologia em Vídeo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>braziliandevs</category>
      <category>codenewbie</category>
    </item>
    <item>
      <title>MongoDB + Node</title>
      <dc:creator>Gabriel_Silvestre</dc:creator>
      <pubDate>Thu, 03 Nov 2022 14:28:47 +0000</pubDate>
      <link>https://dev.to/gabrielhsilvestre/mongodb-node-1cj3</link>
      <guid>https://dev.to/gabrielhsilvestre/mongodb-node-1cj3</guid>
      <description>&lt;h2&gt;
  
  
  Tabela de Conteúdo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mongoose&lt;/li&gt;
&lt;li&gt;URI&lt;/li&gt;
&lt;li&gt;Schemas&lt;/li&gt;
&lt;li&gt;Models&lt;/li&gt;
&lt;li&gt;Links Úteis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Mongoose
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;O Mongoose é uma ferramenta de integração entre Node.js e MongoDB, tendo um funcionamento similar a ORMs, com a principal diferença de trabalhar com um DB NoSQL ao invés de um relacional, devido a isso ele é classificado como ODM &lt;em&gt;(Object Document Mapping)&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que faz?
&lt;/h3&gt;

&lt;p&gt;Como dito em sua definição, o Mongoose facilita a integração entre API e DB, para isso ele conta com diversos recursos que &lt;em&gt;"rodam por baixo dos panos"&lt;/em&gt;, porém um recurso explicito que vale a pena detalhar são os &lt;code&gt;Schemas&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Os &lt;code&gt;Schemas&lt;/code&gt; serão abordados mais a frente, mas o que vale a apena destacar é sua funcionamento, eles atuam de forma similar a uma &lt;em&gt;"tipagem"&lt;/em&gt; para os Documentos do MongoDB, dessa forma podemos garantir um padrão nas Coleções.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalação
&lt;/h3&gt;

&lt;p&gt;Para utilizarmos o Mongoose em nossos projetos primeiro devemos instalá-lo como uma dependência, após ter feito sua instalação tudo que precisamos fazer é conectá-lo a nossa aplicação.&lt;/p&gt;

&lt;p&gt;Para conectar a aplicação ao MongoDB através do Mongoose devemos utilizar o método &lt;code&gt;connect&lt;/code&gt; disponibilizado pela própria biblioteca, passando a &lt;a href="https://mongoosejs.com/docs/connections.html"&gt;URI&lt;/a&gt; como primeiro parâmetro e como segundo podemos passar algumas opções de conexão, essas que são optativas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i mongoose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;connect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongoose&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongodb://localhost:27017/my_db&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  URI
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É a sigla para &lt;em&gt;Uniforme Resource Identifier&lt;/em&gt;, traduzindo, &lt;em&gt;Identificador de Recurso Único&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Em palavras mais simples, é uma &lt;em&gt;string&lt;/em&gt; que irá conter as informações necessárias para a conexão com o DB, esse que pode ser SQL ou NoSQL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;A URI padrão do MongoDB consiste em: nome de usuário; dois pontos &lt;code&gt;:&lt;/code&gt;; senha; arroba &lt;code&gt;@&lt;/code&gt;; e então as informação de conexão, host e porta. Porém esse padrão não é o mais recomendado para se utilizar no Mongoose, afinal não seria nada inteligente deixar o usuário e a senha expostos em &lt;em&gt;hard code&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;No Mongoose podemos utilizar apenas os dados de conexão &lt;em&gt;(host e porta)&lt;/em&gt; e o nome do banco de dados a ser conectado, assim passamos o usuário e senha através de um objeto no segundo parâmetro do método &lt;code&gt;connect&lt;/code&gt; visto logo acima.&lt;/p&gt;

&lt;p&gt;*Obs: &lt;em&gt;As URIs sempre irão começar com &lt;code&gt;mongodb://&lt;/code&gt;&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// URI padrão do MongoDB&lt;/span&gt;

&lt;span class="nx"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongodb://&amp;lt;nome de usuário&amp;gt;:&amp;lt;senha&amp;gt;@&amp;lt;host&amp;gt;:&amp;lt;porta&amp;gt;/&amp;lt;nome do db&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongodb://admin:admin@localhost:27017/my_db&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// URI do Mongoose com options&lt;/span&gt;

&lt;span class="nx"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongodb://&amp;lt;host&amp;gt;:&amp;lt;porta&amp;gt;/&amp;lt;nome do db&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;nome de usuário&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;senha&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongodb://localhost:27017/my_db&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;**Obs: &lt;em&gt;No exemplo acima estamos colocando o usuário e a senha também em "hard code" nas options do &lt;code&gt;connect&lt;/code&gt;, porém isso é apenas a caráter de exemplificação, __o correto seria utilizar variáveis de ambiente&lt;/em&gt;_ para ambas as informações_&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Schemas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

&lt;p&gt;São as estruturas básicas de um Documento MongoDB em nosso código TypeScript, dessa forma conseguimos mapear de forma eficiente todos os campos e por consequência melhorar a experiência de desenvolvimento.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que fazem?
&lt;/h3&gt;

&lt;p&gt;Os Schemas mapeiam os Documentos de uma coleção, facilitando a interação sobre os Documentos dentro do código da aplicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Para definirmos um Schema utilizamos o construtor &lt;code&gt;new Schema&lt;/code&gt; disponibilizado pelo próprio Mongoose, passando como Generic a interface que representa a estrutura do Documento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Schema&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongoose&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cm"&gt;/* generic */&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="cm"&gt;/* nome do campo */&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="cm"&gt;/* tipo do campo */&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="cm"&gt;/* true ou false */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="cm"&gt;/* nome do campo */&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="cm"&gt;/* tipo do campo */&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="cm"&gt;/* true ou false */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Schema&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongoose&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IUser&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;IUser&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;required&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;required&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;required&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs: &lt;em&gt;Podemos passar outros dois Generics para o &lt;code&gt;Schema&lt;/code&gt;, sendo eles a &lt;code&gt;Model&lt;/code&gt; e os &lt;code&gt;TInstanceMethods&lt;/code&gt; respectivamente, porém não iremos abordar eles aqui&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Models
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

&lt;p&gt;No contexto do Mongoose as Models, assim como os Schemas, contém a estrutura básica de um Documento, mas além disso elas também nos disponibilizam métodos para que possamos interagir com os Documentos dentro de uma Coleção.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que fazem?
&lt;/h3&gt;

&lt;p&gt;Como dito em sua definição, as Models nos disponibilizam métodos para que possamos interagir com os Documentos, dessa forma conseguimos adicionar, atualizar, excluir e ler dados contidos nos Documentos de forma fácil.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Para definir uma Model utilizamos a função &lt;code&gt;model()&lt;/code&gt; disponibilizada pelo Mongoose, passando como &lt;em&gt;Generic&lt;/em&gt; a interface que representa aquele documento, já como parâmetros passamos o nome da coleção e o &lt;code&gt;Schema&lt;/code&gt; do Documento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongoose&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="cm"&gt;/* Nome do documento */&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/* nome do campo */&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="cm"&gt;/* tipo do campo */&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/* nome do campo */&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="cm"&gt;/* tipo do campo */&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="cm"&gt;/* nome do campo */&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="cm"&gt;/* tipo do campo */&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="cm"&gt;/* nome do schema */&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cm"&gt;/* interface */&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="cm"&gt;/* nome do campo */&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="cm"&gt;/* tipo do campo */&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="cm"&gt;/* true ou false */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="cm"&gt;/* nome do campo */&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="cm"&gt;/* tipo do campo */&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="cm"&gt;/* true ou false */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="cm"&gt;/* nome da model */&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="cm"&gt;/* interface */&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="cm"&gt;/* nome da coleção */&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* schema */&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongoose&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IUser&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;IUser&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;required&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;required&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;required&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;IUser&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userSchema&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*Obs: &lt;em&gt;Não iremos abordar nenhum método das Models aqui, porém a sessão Links Úteis irá conter um link direcionado diretamente a essa parte da documentação&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links Úteis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mongoosejs.com/docs/guide.html"&gt;Documentação Mongoose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mongoosejs.com/docs/typescript.html"&gt;Mongoose com TypeScript&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mongoosejs.com/docs/connections.html"&gt;Mongoose - Connections Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mongoosejs.com/docs/guide.html"&gt;Mongoose - Schemas Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mongoosejs.com/docs/models.html"&gt;Mongoose - Models Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mongoosejs.com/docs/queries.html"&gt;Mongoose - Queries Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>mongodb</category>
      <category>typescript</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>MongoDB - Updates Complexos</title>
      <dc:creator>Gabriel_Silvestre</dc:creator>
      <pubDate>Wed, 03 Aug 2022 19:55:11 +0000</pubDate>
      <link>https://dev.to/gabrielhsilvestre/mongodb-updates-complexos-58kj</link>
      <guid>https://dev.to/gabrielhsilvestre/mongodb-updates-complexos-58kj</guid>
      <description>&lt;h2&gt;
  
  
  Tabela de Conteúdos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Modificadores de Atualizações em Arrays&lt;/li&gt;
&lt;li&gt;Operador &lt;code&gt;$push&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Operador &lt;code&gt;$pop&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Operador &lt;code&gt;pull&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Operador &lt;code&gt;$addToSet&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Filtros em Arrays&lt;/li&gt;
&lt;li&gt;Links Úteis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Modificadores de Atualizações em Arrays
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

&lt;p&gt;Modificadores de Atualizações em Arrays é uma tradução livre de &lt;em&gt;Update Operator Modifiers&lt;/em&gt;, que nada mais são do que operadores que permitem a modificação do comportamento das atualizações em arrays internos de Documentos, possibilitando a ordenação, por exemplo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Onde/Quando utilizar?
&lt;/h3&gt;

&lt;p&gt;Como visto em sua definição logo acima, esses operadores interagem diretamente com arrays, logo devemos utilizá-los somente em interações onde os campos sejam desse tipo.&lt;/p&gt;

&lt;p&gt;Lembrando que esses operadores, além de estarem restritos aos campos do tipo array, também só poderão ser utilizados em operações de atualização.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quais são?
&lt;/h3&gt;

&lt;p&gt;De acordo com a &lt;a href="https://www.mongodb.com/docs/manual/reference/operator/update-array/#update-operator-modifiers"&gt;documentação oficial&lt;/a&gt;, existem quatro modificadores, esses que serão abordados logo abaixo.&lt;/p&gt;

&lt;p&gt;São eles: &lt;code&gt;$each&lt;/code&gt;; &lt;code&gt;$position&lt;/code&gt;; &lt;code&gt;$slice&lt;/code&gt; e &lt;code&gt;$sort&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Apesar de similares, cada &lt;em&gt;Update Operator Modifiers&lt;/em&gt; possui uma peculiaridade em sua sintaxe, então iremos explicá-los individualmente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;$each&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Função&lt;/strong&gt;: permite a inserção de múltiplos valores em um campo do tipo array. &lt;em&gt;(funciona somente com os operadores &lt;code&gt;$push&lt;/code&gt; e &lt;code&gt;$addToSet&lt;/code&gt;)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sintaxe&lt;/strong&gt;: deve ser declarado após o campo a sofrer modificação e recebe um array com os valores a serem inseridos.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;operador de atualização&amp;gt;: &amp;lt;campo&amp;gt;: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$each&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;valor 1&amp;gt;, &amp;lt;valor 2&amp;gt;, &amp;lt;valor 3&amp;gt;] &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$push&lt;/span&gt;: tasks: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$each&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"study"&lt;/span&gt;, &lt;span class="s2"&gt;"go to the gym"&lt;/span&gt;, &lt;span class="s2"&gt;"read"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;$position&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Função&lt;/strong&gt;: permite a inserção de um, ou mais valores em uma posição específica do array. &lt;em&gt;(funciona somente com o operador &lt;code&gt;$push&lt;/code&gt;)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sintaxe&lt;/strong&gt;: é necessário o uso do &lt;code&gt;$each&lt;/code&gt; previamente, após isso declaramos o &lt;code&gt;$position&lt;/code&gt; e dizemos a partir de qual posição os novos valores serão inseridos.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$push&lt;/span&gt;: &amp;lt;campo&amp;gt;: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$each&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;valor 1&amp;gt;, &amp;lt;valor 2&amp;gt;, &amp;lt;valor 3&amp;gt;], &lt;span class="nv"&gt;$position&lt;/span&gt;: &amp;lt;index&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$push&lt;/span&gt;: tasks: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$each&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"study"&lt;/span&gt;, &lt;span class="s2"&gt;"go to the gym"&lt;/span&gt;, &lt;span class="s2"&gt;"read"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="nv"&gt;$position&lt;/span&gt;: 2 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;$slice&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Função&lt;/strong&gt;: limita a inserção de novos valores. &lt;em&gt;(funciona somente com o operador &lt;code&gt;$push&lt;/code&gt;)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sintaxe&lt;/strong&gt;: é necessário o uso do &lt;code&gt;$each&lt;/code&gt; previamente, após isso declaramos o &lt;code&gt;$slice&lt;/code&gt; e definimos qual o número máximo de valores a serem adicionados.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$push&lt;/span&gt;: &amp;lt;campo&amp;gt;: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$each&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;valor 1&amp;gt;, &amp;lt;valor 2&amp;gt;, &amp;lt;valor 3&amp;gt;], &lt;span class="nv"&gt;$slice&lt;/span&gt;: &amp;lt;index&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$push&lt;/span&gt;: tasks: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$each&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"study"&lt;/span&gt;, &lt;span class="s2"&gt;"go to the gym"&lt;/span&gt;, &lt;span class="s2"&gt;"read"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;, &lt;span class="nv"&gt;$slice&lt;/span&gt;: 2 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;# irá inserir somente o "study" e o "go to the gym"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;$sort&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Função&lt;/strong&gt;: ordena todos os valores contidos no array, bem como os que serão adicionados. &lt;em&gt;(funciona somente com o operador &lt;code&gt;$push&lt;/code&gt;)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sintaxe&lt;/strong&gt;: é necessário o uso do &lt;code&gt;$each&lt;/code&gt; previamente, após isso declaramos o &lt;code&gt;$sort&lt;/code&gt; e definimos por qual campo será feita a ordenação, bem como o tipo de ordenação &lt;em&gt;(crescente ou decrescente)&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$push&lt;/span&gt;: &amp;lt;campo&amp;gt;: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$each&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;valor 1&amp;gt;, &amp;lt;valor 2&amp;gt;], &lt;span class="nv"&gt;$sort&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &amp;lt;tipo de ordenação&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$push&lt;/span&gt;: products: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$each&lt;/span&gt;: &lt;span class="o"&gt;[{&lt;/span&gt; name: &lt;span class="s2"&gt;"doll"&lt;/span&gt;, qty: 5 &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; name:  &lt;span class="s2"&gt;"lego"&lt;/span&gt;, qty: 2 &lt;span class="o"&gt;}]&lt;/span&gt;, &lt;span class="nv"&gt;$sort&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; qty: 1 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;# no caso de não ser um objeto basta definir o tipo de ordenação diretamente =&amp;gt; $sort: 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operador &lt;code&gt;$push&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É um operador que lida diretamente com campos do tipo array, permitindo a adição de novos valores sem a necessidade de recriar o campo do zero.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Há duas formas de se utilizar o operador &lt;code&gt;$push&lt;/code&gt;, podemos adicionar apenas um item ao final do array, ou adicionar vários itens de uma única vez, além de conseguirmos alterar outros comportamentos, como ordenação automática.&lt;/p&gt;

&lt;p&gt;Para o primeiros caso, basta invocarmos o &lt;code&gt;$push&lt;/code&gt;, declararmos o campo a sofrer a adição e por fim definir o item a ser adicionado.&lt;/p&gt;

&lt;p&gt;Já nos outros casos é obrigatório o uso do operador &lt;code&gt;$each&lt;/code&gt;, que além de permitir a inserção de múltiplos valores, também abre a possibilidade de alterarmos mais comportamentos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$push&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &amp;lt;novo item&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$push&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$each&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;novos itens&amp;gt;], &amp;lt;outras configurações&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$push&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; products: &lt;span class="o"&gt;{&lt;/span&gt; name: &lt;span class="s2"&gt;"computer"&lt;/span&gt;, price: 2499.99 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$push&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; products: &lt;span class="nv"&gt;$each&lt;/span&gt;: &lt;span class="o"&gt;[{&lt;/span&gt; name: &lt;span class="s2"&gt;"computer"&lt;/span&gt;, price: 2499.99 &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; name: &lt;span class="s2"&gt;"mouse"&lt;/span&gt;, price: 499.99 &lt;span class="o"&gt;}]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operador &lt;code&gt;$pop&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É um operador de deleção, ele poderá excluir o primeiro ou o último elemento de um array.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Para deletarmos o primeiro ou o último item de um array basta invocarmos o método &lt;code&gt;$pop&lt;/code&gt;, em seguida definimos o campo que contém o array a sofrer a deleção e por fim dizemos qual elemento a ser excluído &lt;em&gt;(primeiro ou último)&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$pop&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &amp;lt;item a ser excluído&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$pop&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; products: 1 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;# 1 =&amp;gt; exclui o último&lt;/span&gt;
&lt;span class="c"&gt;# -1 =&amp;gt; exclui o primeiro&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operador &lt;code&gt;$pull&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É um operador que permite a deleção de itens em um campo do tipo array através de condições, dessa forma todos os itens que se encaixam nas condições definidas são excluídos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;O primeiro passo é invocarmos o &lt;code&gt;$pull&lt;/code&gt;, após isso definimos o campo a sofrer as deleções e por fim dizemos as condições a serem cumpridas para que um elemento seja deletado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$pull&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &amp;lt;query de deleção&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# query é equivalente a "conjunto de condições"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$pull&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; products: &lt;span class="o"&gt;{&lt;/span&gt; price: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$gt&lt;/span&gt;: 400.00 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operador &lt;code&gt;$addToSet&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;Esse operador funciona de forma similar ao &lt;code&gt;$push&lt;/code&gt;, porém além de adicionar novos valores a um campo do tipo array, o &lt;code&gt;$addToSet&lt;/code&gt; também realiza uma verificação para evitar valores duplicados, ou seja, o novo valor somente será inserido se ele for único.&lt;/p&gt;

&lt;p&gt;Vale ressaltar que esse o processo de validar Documentos duplicados é mais &lt;em&gt;"sensível"&lt;/em&gt; ao erro, isso porque o operador irá considerar como duplicata apenas os Documentos que forem &lt;strong&gt;EXATAMENTE IGUAIS&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Assim como seu funcionamento, sua sintaxe também é extremamente similar a do operador &lt;code&gt;$push&lt;/code&gt;, o que significa que podemos adicionar um item, ou mais itens de uma única vez utilizando o &lt;code&gt;$each&lt;/code&gt;, porém o &lt;code&gt;$addToSet&lt;/code&gt; não aceita outras opções como o &lt;code&gt;$sort&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para adicionarmos um item basta invocarmos o operador &lt;code&gt;$addToSet&lt;/code&gt;, seguido do campo a sofrer a adição e então definimos o novo valor a ser adicionado.&lt;/p&gt;

&lt;p&gt;Já para adicionarmos múltiplos itens, invocamos o operador &lt;code&gt;$addToSet&lt;/code&gt;, seguido do campo a sofrer a adição, depois declaramos o operador &lt;code&gt;$each&lt;/code&gt; e por fim, dentro de um array, definimos os valores a serem adicionados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$addToSet&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &amp;lt;valor&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$addToSet&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$each&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;valor1&amp;gt;, &amp;lt;valor2&amp;gt;, &amp;lt;valor3&amp;gt;] &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$addToSet&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; email: gabriel@gabriel.com &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$addToSet&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; email: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$each&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;gabriel@gabriel.com, daniela@daniela.com, fran@fran.com] &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs: &lt;em&gt;"Caso exista um valor duplicado dentro do array que estamos realizando a adição, o MongoDB executará a ação sem levantar nenhum erro, porém o valor duplicado não é adicionado, apenas mantêm-se o valor pré-existente"&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Filtros em Arrays
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

&lt;p&gt;São formas pelas quais podemos selecionar um único valor dentro de um array de forma dinâmica, fazendo um paralelo com o JS, seria equivalente a HOF &lt;code&gt;.find()&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;A sintaxe desses filtros, apesar de simples, tem sua peculiaridade, isso porque ela funciona de forma similar a interpolação do &lt;a href="https://dev.to/gabrielhsilvestre/model-uma-breve-introducao-4gch/#query-din%C3%A2mica"&gt;mysql2&lt;/a&gt; com node.&lt;/p&gt;

&lt;p&gt;Utilizamos os filtros de array dentro operações de atualização, através do operador &lt;a href="https://www.mongodb.com/docs/manual/reference/operator/update/positional-filtered/#up._S_%5B%3Cidentifier%3E%5D"&gt;&lt;code&gt;$[&amp;lt;identifier&amp;gt;]&lt;/code&gt;&lt;/a&gt; definimos um nome genérico que será usado como referência na interpolação. Agora para realmente definirmos o valor a ser buscado, utilizamos a opção &lt;code&gt;arrayFilters&lt;/code&gt;, passando todas as referências que criamos anteriormente e atribuindo um valor a elas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;operação de att&amp;gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;.&lt;span class="nv"&gt;$[&lt;/span&gt;&amp;lt;referência&amp;gt;]: &amp;lt;novo valor&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;span class="o"&gt;{&lt;/span&gt; arrayFilters: &lt;span class="o"&gt;[{&lt;/span&gt; &amp;lt;referência&amp;gt;: &amp;lt;valor a ser buscado&amp;gt; &lt;span class="o"&gt;}]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$set&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; tasks.&lt;span class="nv"&gt;$[&lt;/span&gt;t].title: &lt;span class="s2"&gt;"study Node"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
&lt;span class="o"&gt;{&lt;/span&gt; arrayFilters: &lt;span class="o"&gt;[{&lt;/span&gt; t.title: &lt;span class="s2"&gt;"study React"&lt;/span&gt; &lt;span class="o"&gt;}]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# o item com o "title" study React vai ter seu valor trocado para study Node&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Por se tratar de um recurso mais complexo, irei exemplificar com o método de atualização completo&lt;/span&gt;
&lt;span class="c"&gt;# A função continua sendo a mesma, trocar "study React" por "study Node"&lt;/span&gt;

db.user_tasks.updateOne&lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt; _id: 1 &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$set&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; tasks.&lt;span class="nv"&gt;$[&lt;/span&gt;T].title: &lt;span class="s2"&gt;"study Node"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;{&lt;/span&gt; arrayFilters: &lt;span class="o"&gt;[{&lt;/span&gt; T.title: &lt;span class="s2"&gt;"study React"&lt;/span&gt; &lt;span class="o"&gt;}]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links Úteis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/operator/update-array/#update-operators"&gt;Operadores de Atualização&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/operator/update-array/#update-operator-modifiers"&gt;Modificadores de Atualização&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/operator/update/positional-filtered/"&gt;Operador &lt;code&gt;$[&amp;lt;identifier&amp;gt;]&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/operator/update/positional/"&gt;Operador &lt;code&gt;$(update)&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/operator/update/positional-all/"&gt;Operador &lt;code&gt;$[]&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//../Day-29.3/Operadores-Consulta.md"&gt;Operadores de Consulta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//../Day-29.4/Update-Simples.md"&gt;Update Simples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>MongoDB - Updates Simples</title>
      <dc:creator>Gabriel_Silvestre</dc:creator>
      <pubDate>Fri, 22 Jul 2022 14:01:27 +0000</pubDate>
      <link>https://dev.to/gabrielhsilvestre/mongodb-updates-simples-21i0</link>
      <guid>https://dev.to/gabrielhsilvestre/mongodb-updates-simples-21i0</guid>
      <description>&lt;h2&gt;
  
  
  Tabela de Conteúdo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;updateOne()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;updateMany()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Operador &lt;code&gt;$set&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Operador &lt;code&gt;$mul&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Operador &lt;code&gt;$inc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Operadores &lt;code&gt;$min&lt;/code&gt; e &lt;code&gt;$max&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Operador &lt;code&gt;$currentDate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Operador &lt;code&gt;$rename&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Operador &lt;code&gt;$unset&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Links Úteis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  updateOne()
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É um método do MongoDB que nos permite atualizar um único Documento dentro de uma coleção, mesmo que não passemos um filtro o método irá atualizar apenas um Documento.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;O &lt;code&gt;updateOne()&lt;/code&gt; pode receber até três parâmetros, sendo os dois primeiros obrigatórios, são eles: um filtro; o &lt;em&gt;"update"&lt;/em&gt; em si; e ao final opções para o update.&lt;/p&gt;

&lt;p&gt;O filtro consiste em uma condição para que possamos achar o Documento a ser atualizado, nele podemos construir uma expressão de verificação utilizando qualquer um dos Operadores de Comparação/Lógicos vistos anteriormente.&lt;/p&gt;

&lt;p&gt;Já o &lt;em&gt;"update"&lt;/em&gt; são os campos com os novos dados a serem inseridos no Documento, nele podemos atualizar todos os campos ou apenas um. Enquanto as opções são configurações extras e opcionais que podemos fazer em nosso &lt;code&gt;updateOne()&lt;/code&gt;, como definir as regras de comparação de &lt;code&gt;strings&lt;/code&gt;, por exemplo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;db.&amp;lt;coleção&amp;gt;.updateOne&lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;filtro&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;update&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;opções&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# opcional&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;db.my-collection.updateOne&lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt; name: &lt;span class="s2"&gt;"Gabriel"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$set&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; age: 22 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# o operador $set será abordado mais a frente&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  updateMany()
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É um método que permite a atualização de múltiplos Documentos de uma só vez e caso não utilizemos um filtro, todos os Documentos da Coleção serão atualizados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;A sintaxe do &lt;code&gt;updateMany()&lt;/code&gt; segue exatamente o mesmo padrão do &lt;code&gt;updateOne()&lt;/code&gt;, recebendo até três parâmetros &lt;em&gt;(filtro, update, opções)&lt;/em&gt; sendo os dois primeiros obrigatórios.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;db.&amp;lt;coleção&amp;gt;.updateMany&lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;filtro&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;update&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;opções&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# opcional&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;db.my-collection.updateMany&lt;span class="o"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt; sale: &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;,
  &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$mul&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; price: Decimal128&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"0.8"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# o operador $mul será abordado mais a frente&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operador $set
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É um operador que irá alterar o valor de um, ou mais campos especificados, podendo alterar tantos os campos de &lt;code&gt;1º nível&lt;/code&gt; do Documento, assim como campos &lt;em&gt;embedados&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Por se tratar de um operador, seu uso deve ser feito dentro de um método que o aceite, no caso métodos de &lt;em&gt;update&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Para utilizá-lo é muito simples, basta o declararmos e logo após definimos os campos e os seus novos valores.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$set&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &amp;lt;valor&amp;gt;, &amp;lt;campo&amp;gt;: &amp;lt;valor&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$set&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; color: &lt;span class="s2"&gt;"blue"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operador $mul
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É um operador que irá &lt;strong&gt;MUL&lt;/strong&gt;tiplicar o valor do campo selecionado por um multiplicador especificado e como já é de se esperar, esse operador somente irá funcionar em campos do tipo numérico&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;A sintaxe do &lt;code&gt;$mul&lt;/code&gt; é tão simples quanto a do &lt;code&gt;$set&lt;/code&gt;, com a única diferença de que algumas vezes iremos precisar realizar a conversão de tipos, como por exemplo de um inteiro para decimal.&lt;/p&gt;

&lt;p&gt;Para realizar a multiplicação, tudo que precisamos fazer é declarar o campo a sofrer essa alteração e o multiplicador, se necessário, também precisamos fazer a conversão de tipos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$mul&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &amp;lt;multiplicador&amp;gt;, &amp;lt;campo&amp;gt;: &amp;lt;conversor&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;&amp;lt;multiplicador&amp;gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$mul&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; price: 0.8, &lt;span class="s2"&gt;"sale.percentage"&lt;/span&gt;: 0.2 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs: &lt;em&gt;"Caso o campo no qual estamos tentando aplicar a multiplicação não exista, o MongoDB automaticamente o criará e atribuirá valor &lt;code&gt;0&lt;/code&gt; a ele"&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operador $inc
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É um operador que incrementa ou decrementa, campos numéricos. O decremento é, de forma objetiva, um &lt;em&gt;"incremento negativo"&lt;/em&gt;, ou seja, utilizamos o &lt;code&gt;$inc&lt;/code&gt; com um número negativo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Para realizarmos o incremento de um campo tudo que precisamos fazer é declarar o operador &lt;code&gt;$inc&lt;/code&gt; e o campo a ser modificado, juntamente com o valor desejado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$inc&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &amp;lt;valor&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$inc&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; qty: &lt;span class="nt"&gt;-5&lt;/span&gt;, order: 1 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs: &lt;em&gt;"Caso o campo no qual estamos tentando aplicar o incremento não exista, o MongoDB automaticamente o criará e o atribuirá valor que estamos tentando aplicar a ele, mesmo que esse valor seja negativo"&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operadores $min e $max
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

&lt;p&gt;São operadores que realizam uma comparação para então aplicar a modificação desejada.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;$min&lt;/code&gt; irá aplicar a modificação apenas nos campos que possuírem um valor maior do que aquele especificado por nós após o operador, em palavras mais simples, o &lt;code&gt;$min&lt;/code&gt; irá &lt;em&gt;"arrastar"&lt;/em&gt; o valor do campo para baixo.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;$max&lt;/code&gt; irá aplicar a modificação apenas nos campos que possuírem um valor menor do que aquele especificado por nós após o operador, em palavras mais simples, o &lt;code&gt;$max&lt;/code&gt; iras &lt;em&gt;"arrastar"&lt;/em&gt; o valor do campo para cima.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Apesar dos operadores possuírem comportamentos opostos, a sintaxe segue a mesma para ambos.&lt;/p&gt;

&lt;p&gt;Primeiro declaramos o operador &lt;code&gt;$min&lt;/code&gt;/&lt;code&gt;$max&lt;/code&gt;, em seguida o campo que queremos modificar e por fim o novo valor que desejarmos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$min&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &amp;lt;valor&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$max&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &amp;lt;valor&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$min&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; stamina: 0 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$max&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; maxMana: 4000 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs: &lt;em&gt;"Caso o campo no qual estamos tentando aplicar a modificação não exista, o MongoDB automaticamente o criará e o atribuirá valor que estamos tentando aplicar a ele, mesmo que esse valor seja negativo"&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operador $currentDate
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É um operador que irá atribuir a data corrente ao campo especificado, essa data pode ter dois tipos: o &lt;code&gt;Date&lt;/code&gt;, que é o padrão; ou o &lt;code&gt;timestamps&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Para utilizarmos o operador &lt;code&gt;$currentDate&lt;/code&gt; tudo o que precisamos fazer é declará-lo, dizer qual campo irá recebe-lo e por fim passar &lt;code&gt;true&lt;/code&gt; como valor do campo.&lt;/p&gt;

&lt;p&gt;Porém se quisermos utilizar &lt;code&gt;timestamp&lt;/code&gt; como formato precisamos utilizar o operador &lt;code&gt;$type&lt;/code&gt;, especificando o formato &lt;code&gt;timestamp&lt;/code&gt; através de uma string.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$currentDate&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &amp;lt;formato&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$currentDate&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; lastUpdate: &lt;span class="nb"&gt;true&lt;/span&gt;, canceled: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$type&lt;/span&gt;: &lt;span class="s2"&gt;"timestamp"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs: &lt;em&gt;"Caso o campo no qual estamos tentando aplicar a modificação de data não exista, o MongoDB automaticamente o criará e o atribuirá a data atual a ele no formato especificado"&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operador $rename
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É um operador que permite a troca da nomenclatura dos campos de um ou mais Documentos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;A sintaxe geral segue a mesma estrutura dos operadores vistos anteriormente, o invocamos, dizemos o campo a sofrer a modificação e por fim especificamos um novo valor. A única diferença é que o &lt;code&gt;$rename&lt;/code&gt; não irá alterar o valor do campo, mas o campo em si.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Primeiro invocamos o operador &lt;code&gt;$rename&lt;/code&gt;, em seguida declaramos o campo a ser renomeado e por fim dizemos qual deverá ser o novo nome.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$rename&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &amp;lt;novo nome&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$rename&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; promotion: &lt;span class="s2"&gt;"sales"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs: &lt;em&gt;"Caso o campo que estamos tentando renomear não exista, o MongoDB não irá gerar um erro, apenas não realizará nenhuma modificação"&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operador $unset
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É um operador de deleção de campos, sempre que desejarmos excluir algum campo de um ou mais documentos, utilizamos o &lt;code&gt;$unset&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Invocamos o operador &lt;code&gt;$unset&lt;/code&gt;, seguido do campo a ser deletado e por fim passamos uma string vazia como valor.&lt;/p&gt;

&lt;p&gt;Vale reforçar que o valor pode ser &lt;strong&gt;literalmente qualquer coisa&lt;/strong&gt;, porém a documentação oficial exemplifica com uma string vazia.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$unset&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$unset&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; uselessCamp: &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$unset&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; uselessCamp: &lt;span class="s2"&gt;"trem"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# irá deletar o campo uselessCamp igual&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs: &lt;em&gt;"Caso o campo que estamos tentando deletar não exista, o MongoDB não irá gerar um erro, apenas não realizará nenhuma modificação"&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links Úteis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/method/db.collection.updateOne/"&gt;&lt;code&gt;updateOne&lt;/code&gt; docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/method/db.collection.updateMany/"&gt;&lt;code&gt;updateMany&lt;/code&gt; docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/operator/update-field/"&gt;Operadores de Atualização&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.mongodb.com/docs/mongodb-shell/reference/data-types/"&gt;Tipos de Dados do MongoDB&lt;/a&gt; &lt;em&gt;Mongosh&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/bson-type-comparison-order/#faq-dev-compare-order-for-bson-types"&gt;Ordem de Comparação para dados diferentes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//../Day-29.2/Filter-Operators.md"&gt;Filtros&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//../Day-29.3/Operadores-Consulta.md"&gt;Operadores de Consulta&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;small&gt;voltar ao topo&lt;/small&gt;&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>MongoDB - Consulta em Arrays</title>
      <dc:creator>Gabriel_Silvestre</dc:creator>
      <pubDate>Mon, 18 Jul 2022 17:38:00 +0000</pubDate>
      <link>https://dev.to/gabrielhsilvestre/introducao-a-consulta-em-arrays-no-mongodb-5nm</link>
      <guid>https://dev.to/gabrielhsilvestre/introducao-a-consulta-em-arrays-no-mongodb-5nm</guid>
      <description>&lt;h2&gt;
  
  
  Tabela de Conteúdos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Busca em Arrays&lt;/li&gt;
&lt;li&gt;Busca de Avaliação&lt;/li&gt;
&lt;li&gt;Links Úteis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Busca em Arrays
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É 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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quais são?
&lt;/h3&gt;

&lt;p&gt;De acordo com a &lt;a href="https://www.mongodb.com/docs/manual/reference/operator/query-array/"&gt;documentação oficial&lt;/a&gt; existem três operadores que realizam buscas dentro de arrays, são eles: &lt;code&gt;$all&lt;/code&gt;, &lt;code&gt;$elemMatch&lt;/code&gt; e &lt;code&gt;$size&lt;/code&gt;. Cada um deles será explicado melhor logo abaixo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;operador&amp;gt;: &amp;lt;valor&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;code&gt;$all&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Função&lt;/strong&gt;: 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.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; foods: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$all&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"burger"&lt;/span&gt;, &lt;span class="s2"&gt;"fries"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# retorna todos os Documentos que possuam burger e fries no campo "foods"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$elemMatch&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Função&lt;/strong&gt;: 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.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; sales: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$elemMatch&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$gt&lt;/span&gt;: 40, &lt;span class="nv"&gt;$lt&lt;/span&gt;: 80 &lt;span class="o"&gt;}}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  

&lt;span class="c"&gt;# retorna todos os Documentos que possuam ao menos um valor maior que 40 e menor que 80 no campo "sales"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$size&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Função&lt;/strong&gt;: retorna todos os Documentos em que o campo pesquisado seja um array com o tamanho especificado.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; tags: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$size&lt;/span&gt;: 4 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  

&lt;span class="c"&gt;# retorna todos os Documentos que possuam exatamente 4 elementos dentro do campo "tags"&lt;/span&gt;

&lt;span class="c"&gt;# não é possível buscar utilizar o $size junto de Operadores de Comparação,&lt;/span&gt;
&lt;span class="c"&gt;# por exemplo: um array com MAIS DE dois elementos&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Busca de Avaliação
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

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

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

&lt;h3&gt;
  
  
  Quais são?
&lt;/h3&gt;

&lt;p&gt;Existem ao todo seis &lt;em&gt;Evaluation Query Operators&lt;/em&gt;, porém aqui iremos abordar somente os operadores: &lt;code&gt;expr&lt;/code&gt;, &lt;code&gt;$regex&lt;/code&gt; e &lt;code&gt;$mod&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Cada &lt;em&gt;Evaluation Query Operators&lt;/em&gt; possui uma sintaxe muito distinta, então iremos explicar a sintaxe de cada um individualmente.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$expr&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Função&lt;/strong&gt;: 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.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sintaxe&lt;/strong&gt;: declaramos o operador &lt;code&gt;$expr&lt;/code&gt;, 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 &lt;code&gt;$&lt;/code&gt; assim como os operadores.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$expr&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$gt&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$credit&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;, &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$debit&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# retorna todos os Documentos em que o campo "credit" seja maior que "debit"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$regex&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Função&lt;/strong&gt;: permite a pesquisa de textos através de REGEX.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sintaxe&lt;/strong&gt;: declaramos o campo que desejamos realizar a busca, em seguida utilizamos o operador &lt;code&gt;$regex&lt;/code&gt; com a REGEX a ser verificada.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; title: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$regex&lt;/span&gt;: /Lord/i &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# retorna todos os Documentos em que o campo "title" seja válido pela REGEX /lord/i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$mod&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Função&lt;/strong&gt;: retorna todos os Documentos em que o campo selecionado dividido pelo valor declarado, resulte no módulo esperado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sintaxe&lt;/strong&gt;: declaramos o campo que desejamos verificar, em seguida utilizamos o operador &lt;code&gt;$mod&lt;/code&gt; e através de um array declaramos o divisor e o módulo esperado, respectivamente.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; qty: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$mod&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;2, 0] &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# retorna todos os Documentos em que o campo "qty" dividido por 2, tenha um módulo igual a 0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links Úteis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/operator/query-array/"&gt;Array Query Operators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/tutorial/query-array-of-documents/"&gt;Query an Array of Embedded Documents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/operator/query-evaluation/"&gt;Evaluation Query Operators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/operator/query/text/#match-operation-stemmed-words"&gt;Operador &lt;code&gt;$text&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mongodb</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>MondoDB - Filter Operators</title>
      <dc:creator>Gabriel_Silvestre</dc:creator>
      <pubDate>Wed, 29 Jun 2022 20:07:00 +0000</pubDate>
      <link>https://dev.to/gabrielhsilvestre/introducao-ao-mongodb-filter-operators-45gd</link>
      <guid>https://dev.to/gabrielhsilvestre/introducao-ao-mongodb-filter-operators-45gd</guid>
      <description>&lt;h2&gt;
  
  
  Tabela de Conteúdos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Operadores de Comparação&lt;/li&gt;
&lt;li&gt;Operadores Lógicos&lt;/li&gt;
&lt;li&gt;Método &lt;code&gt;sort()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Removendo Documentos&lt;/li&gt;
&lt;li&gt;Links Úteis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Operadores de Comparação
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Todos os Operadores de Comparação seguem a mesma estrutura base, indicamos o campo que queremos verificar, seguido do operador junto do valor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;operador&amp;gt;: &amp;lt;valor&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs: &lt;em&gt;Lembrando que esses operadores devem ser aplicados a métodos que suportem a aplicação de filtros, como o &lt;code&gt;find()&lt;/code&gt;, &lt;code&gt;countDocuments()&lt;/code&gt; ou o &lt;code&gt;update()&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Quais são?
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$lt&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tradução&lt;/strong&gt;: &lt;em&gt;Less than&lt;/em&gt;, em português &lt;em&gt;Menor que&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O operador irá buscar todos os valores &lt;em&gt;Menores que&lt;/em&gt; ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; age: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$lt&lt;/span&gt;: 20 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# busca todos os Documentos com a propriedade "age" menor que 20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$lte&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tradução&lt;/strong&gt;:  &lt;em&gt;Less than or Equal&lt;/em&gt;, em português &lt;em&gt;Menor ou Igual a&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O operador irá buscar todos os valores &lt;em&gt;Menores ou Iguais a&lt;/em&gt; ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; price: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$lte&lt;/span&gt;: 29 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# busca todos os Documentos com a propriedade "price" menor ou igual a 29&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$gt&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tradução&lt;/strong&gt;:  &lt;em&gt;Greater than&lt;/em&gt;, em português &lt;em&gt;Maior que&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O operador irá buscar todos os valores &lt;em&gt;Maiores que&lt;/em&gt; ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; age: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$gt&lt;/span&gt;: 18 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# busca todos os Documentos com a propriedade "age" maior que 18&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$gte&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tradução&lt;/strong&gt;:  &lt;em&gt;Greater than or Equal&lt;/em&gt;, em português &lt;em&gt;Maior ou Igual a&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O operador irá buscar todos os valores &lt;em&gt;Maiores ou Iguais a&lt;/em&gt; ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; mana: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$gte&lt;/span&gt;: 400 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# busca todos os Documentos com a propriedade "mana" maior ou igual a 400&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$eq&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tradução&lt;/strong&gt;:  &lt;em&gt;Equal&lt;/em&gt;, em português &lt;em&gt;Igual a&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O operador irá buscar todos os valores &lt;em&gt;Iguais a&lt;/em&gt; ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; _id: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$eq&lt;/span&gt;: 2 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# busca todos os Documentos com a propriedade "_id" igual a 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; _id: 2 &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# podemos omitir o operador $eq de nosso filtro e o comportamento será o mesmo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$ne&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tradução&lt;/strong&gt;:  &lt;em&gt;Not Equal&lt;/em&gt;, em português &lt;em&gt;Diferentes de&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O operador irá buscar todos os valores &lt;em&gt;Diferentes de&lt;/em&gt; ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; class: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$ne&lt;/span&gt;: &lt;span class="s2"&gt;"Fighter"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# busca todos os Documentos com a propriedade "class" diferente de Fighter&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$in&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tradução&lt;/strong&gt;:  &lt;em&gt;In&lt;/em&gt;, em português &lt;em&gt;Dentro de&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O operador irá buscar todos os valores &lt;em&gt;Dentro de&lt;/em&gt; ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; country: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$in&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"BR"&lt;/span&gt;, &lt;span class="s2"&gt;"USA"&lt;/span&gt;, &lt;span class="s2"&gt;"CAN"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# busca todos os Documentos com a propriedade "country" dentro das seguintes opções BR, USA, CAN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$nin&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tradução&lt;/strong&gt;:  &lt;em&gt;Not In&lt;/em&gt;, em português &lt;em&gt;Fora de&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O operador irá buscar todos os valores &lt;em&gt;Fora de&lt;/em&gt; ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; country: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$nin&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"BR"&lt;/span&gt;, &lt;span class="s2"&gt;"USA"&lt;/span&gt;, &lt;span class="s2"&gt;"CAN"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# busca todos os Documentos com a propriedade "country" fora das seguintes opções BR, USA, CAN&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operadores Lógicos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

&lt;p&gt;Assim como em linguagens de programação, os Operadores Lógicos do MongoDB realizam &lt;em&gt;"inferências lógicas"&lt;/em&gt;, exemplificando, podemos verificar se a condição &lt;code&gt;X&lt;/code&gt; &lt;strong&gt;E&lt;/strong&gt; a condição &lt;code&gt;Y&lt;/code&gt; são verdadeiras, assim como também podemos verificar se ao menos uma delas é verdadeira através do &lt;strong&gt;OU&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Assim como os 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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;O único Operador Lógico que não suporta essa concatenação é o &lt;code&gt;$not&lt;/code&gt; e sua estrutura consiste em utilizar o operador depois do campo e antes da verificação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Sintaxe para o operador $not&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;operador lógico&amp;gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;operador de comparação&amp;gt;: &amp;lt;valor&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Sintaxe para os o restante dos operadores&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;operador lógico&amp;gt;: &lt;span class="o"&gt;[{&lt;/span&gt; &amp;lt;campo&amp;gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;comparador&amp;gt;: &amp;lt;valor&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;campo&amp;gt;: &lt;span class="o"&gt;{&lt;/span&gt; &amp;lt;comparador&amp;gt;: &amp;lt;valor&amp;gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Quais são?
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$not&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tradução&lt;/strong&gt;:  &lt;em&gt;Not&lt;/em&gt;, em português &lt;em&gt;Não é&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O operador irá buscar todos os valores que &lt;em&gt;Não são&lt;/em&gt; ... / &lt;em&gt;Não possuem&lt;/em&gt; ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; price: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$not&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$gt&lt;/span&gt;: 19.99 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# busca todos os Documentos com a propriedade "price" NÃO maior que 19.99&lt;/span&gt;

&lt;span class="c"&gt;# também busca todos os Documentos que NÃO possuem a propriedade "price"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$or&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tradução&lt;/strong&gt;:  &lt;em&gt;Or&lt;/em&gt;, em português &lt;em&gt;Ou&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O operador irá buscar todos os valores que &lt;em&gt;Ou é isso, Ou é aquilo&lt;/em&gt; ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$or&lt;/span&gt;: &lt;span class="o"&gt;[{&lt;/span&gt; promo: &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; price: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$lt&lt;/span&gt;: 19.99 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;# busca todos os documentos que a propriedade "promo" seja verdadeira,&lt;/span&gt;
&lt;span class="c"&gt;# OU que tenham a propriedade "price" menor que 19.99&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$nor&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tradução&lt;/strong&gt;:  &lt;em&gt;Or not&lt;/em&gt;, em português &lt;em&gt;Ou não&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O operador irá buscar todos os valores que &lt;em&gt;Ou Não é isso, Ou Não é aquilo&lt;/em&gt; ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$nor&lt;/span&gt;: &lt;span class="o"&gt;[{&lt;/span&gt; promo: &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; price: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$lt&lt;/span&gt;: 19.99 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;# busca todos os documentos que a propriedade "promo" NÃO seja verdadeira,&lt;/span&gt;
&lt;span class="c"&gt;# OU que propriedade "price" NÃO seja menor que 19.99&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;$and&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tradução&lt;/strong&gt;:  &lt;em&gt;AND&lt;/em&gt;, em português &lt;em&gt;E&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O operador irá buscar todos os valores que &lt;em&gt;são isso E aquilo&lt;/em&gt; ...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$and&lt;/span&gt;: &lt;span class="o"&gt;[{&lt;/span&gt; promo: &lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; price: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$lt&lt;/span&gt;: 19.99 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c"&gt;# busca todos os documentos que a propriedade "promo" seja verdadeira,&lt;/span&gt;
&lt;span class="c"&gt;# E que tenham a propriedade "price" menor que 19.99&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;sort()&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;O método &lt;code&gt;sort()&lt;/code&gt; deve ser utilizado após uma busca, ou seja, deve ser invocado logo após o método &lt;code&gt;find()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;code&gt;sort()&lt;/code&gt; aceita &lt;em&gt;"infinitos"&lt;/em&gt; parâmetros, esses que devem vir no formato &lt;em&gt;chave:valor&lt;/em&gt;, 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.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;db.my-collection.find&lt;span class="o"&gt;()&lt;/span&gt;.sort&lt;span class="o"&gt;({&lt;/span&gt; &amp;lt;campo&amp;gt;: &amp;lt;tipo de ordenação&amp;gt; &lt;span class="o"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;db.my-collection.find&lt;span class="o"&gt;()&lt;/span&gt;.sort&lt;span class="o"&gt;({&lt;/span&gt; price: 1 &lt;span class="o"&gt;})&lt;/span&gt;  &lt;span class="c"&gt;# 1 indica ordenação crescente&lt;/span&gt;
db.my-collection.find&lt;span class="o"&gt;()&lt;/span&gt;.sort&lt;span class="o"&gt;({&lt;/span&gt; price: &lt;span class="nt"&gt;-1&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;  &lt;span class="c"&gt;# -1 indica ordenação decrescente&lt;/span&gt;

db.my-collection.find&lt;span class="o"&gt;()&lt;/span&gt;.sort&lt;span class="o"&gt;({&lt;/span&gt; price: 1 &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; title: 1 &lt;span class="o"&gt;})&lt;/span&gt;  &lt;span class="c"&gt;# podemos ordenar por mais de um campo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Removendo Documentos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É a forma como podemos deletar um, ou mais, Documentos de nossa Coleção.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Obs: &lt;em&gt;Também podemos realizar deleções sem definir um filtro específico, porém isso não é recomendado. (equivalente ao DELETE sem WHERE).&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# para deletar apenas um documento utilizamos o deleteOne()&lt;/span&gt;

db.my-collection.deleteOne&lt;span class="o"&gt;({})&lt;/span&gt;  &lt;span class="c"&gt;# exclui apenas o primeiro Documento da Coleção&lt;/span&gt;
db.my-collection.deleteOne&lt;span class="o"&gt;({&lt;/span&gt; _id: 4 &lt;span class="o"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# para deletar diversos documentos de uma única vez, utilizamos o deleteMany()&lt;/span&gt;

db.my-collection.deleteMany&lt;span class="o"&gt;({})&lt;/span&gt;  &lt;span class="c"&gt;# irá deletar TODOS os Documentos da Coleção&lt;/span&gt;
db.my-collection.deleteMany&lt;span class="o"&gt;({&lt;/span&gt; qty: 0 &lt;span class="o"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links Úteis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/bson-type-comparison-order/#bson-types-comparison-order"&gt;Ordem de Comparação/Ordenação&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/operator/query-comparison/"&gt;Operadores de Comparação&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/operator/query-logical/"&gt;Operadores Lógicos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/method/js-collection/"&gt;Métodos de Coleção&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Introdução ao MongoDB</title>
      <dc:creator>Gabriel_Silvestre</dc:creator>
      <pubDate>Mon, 20 Jun 2022 20:54:14 +0000</pubDate>
      <link>https://dev.to/gabrielhsilvestre/introducao-ao-mongodb-3h05</link>
      <guid>https://dev.to/gabrielhsilvestre/introducao-ao-mongodb-3h05</guid>
      <description>&lt;h2&gt;
  
  
  Tabela de Conteúdos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Estrutura do MongoDB&lt;/li&gt;
&lt;li&gt;Bancos de Dados&lt;/li&gt;
&lt;li&gt;Coleções&lt;/li&gt;
&lt;li&gt;Documentos&lt;/li&gt;
&lt;li&gt;Regras&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InsertOne&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InsertMany&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Find&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Operadores de Comparação&lt;/li&gt;
&lt;li&gt;Links Úteis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Estrutura do MongoDB
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Classe
&lt;/h3&gt;

&lt;h4&gt;
  
  
  O que é?
&lt;/h4&gt;

&lt;p&gt;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 &lt;strong&gt;classes&lt;/strong&gt; diferentes.&lt;/p&gt;

&lt;h4&gt;
  
  
  Document
&lt;/h4&gt;

&lt;p&gt;Não iremos abordar todos os tipo de classe NoSQL aqui, iremos focar apenas na classe do MongoDB, Document.&lt;/p&gt;

&lt;p&gt;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 &lt;em&gt;"Objeto JavaScript"&lt;/em&gt;, onde temos &lt;code&gt;chave:valor&lt;/code&gt;, sendo que cada valor poderá conter outro objeto e assim sucessivamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Qual é?
&lt;/h3&gt;

&lt;p&gt;A estrutura &lt;em&gt;"interna"&lt;/em&gt; do MongoDB consiste em três partes, que serão explicadas logo abaixo, são elas: os &lt;a href=""&gt;Bancos de Dados&lt;/a&gt;, as &lt;a href=""&gt;Coleções&lt;/a&gt; e os &lt;a href=""&gt;Documentos&lt;/a&gt;.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Bancos de Dados
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

&lt;p&gt;Assim como em DB relacionais, os NoSQL podem possuir mais de um banco de dados cada, ou seja, é onde iremos armazenar as &lt;em&gt;Coleções&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A maior diferença entre Bancos de Dados SQL e MongoDB &lt;small&gt;&lt;em&gt;(além do funcionamento interno)&lt;/em&gt;&lt;/small&gt; é a capacidade de se &lt;em&gt;"auto criar"&lt;/em&gt; 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.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Coleções
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

&lt;p&gt;Fazendo um paralelo aos DB relacionais, as Coleções seriam equivalentes as Tabelas, que por sua vez seriam responsáveis por armazenar &lt;em&gt;Documentos&lt;/em&gt;.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Documentos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Regras
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  SQL x MongoDB
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Obs&lt;/strong&gt;: &lt;em&gt;Podemos aplicar regras em níveis de Coleção, porém caso já existam Documentos salvos, as regras podem impactá-los.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Regrando
&lt;/h3&gt;

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

&lt;p&gt;&lt;a href="https://www.mongodb.com/docs/manual/core/schema-validation/"&gt;Documentação - Schema Validation&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;InsertOne()&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;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).&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;use &amp;lt;nome &lt;span class="k"&gt;do &lt;/span&gt;banco de dados&amp;gt;
db.&amp;lt;nome da coleção&amp;gt;.insertOne&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;use my-database
db.user.insertOne&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"Gabriel"&lt;/span&gt;, &lt;span class="s2"&gt;"age"&lt;/span&gt;: 21 &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;InsertMany()&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É 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.&lt;/p&gt;

&lt;p&gt;Quando inseridos de forma ordenada, os Documentos podem sofrer uma &lt;em&gt;"parada"&lt;/em&gt; 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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Esse comando é extremamente similar ao &lt;code&gt;insertOne&lt;/code&gt;, com a única diferença que iremos passar nossos Documentos dentro de um Array.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;use &amp;lt;nome &lt;span class="k"&gt;do &lt;/span&gt;banco de dados&amp;gt;
db.&amp;lt;nome da coleção&amp;gt;.insertMany&lt;span class="o"&gt;([{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}])&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;use my-database
db.user.insertMany&lt;span class="o"&gt;([{&lt;/span&gt; &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"Gabriel"&lt;/span&gt;, &lt;span class="s2"&gt;"age"&lt;/span&gt;: 21 &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;"name"&lt;/span&gt;: &lt;span class="s2"&gt;"Daniela"&lt;/span&gt;, &lt;span class="s2"&gt;"age"&lt;/span&gt;: 23 &lt;span class="o"&gt;}])&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;Find()&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É um comando para a pesquisa de Documentos, onde podemos aplicar filtros de busca, bem como definir o formato de retorno da busca.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

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

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;O segundo argumento é uma &lt;em&gt;"modelagem"&lt;/em&gt; 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 &lt;code&gt;1&lt;/code&gt; e caso desejarmos ocultá-lo usamos o número &lt;code&gt;0&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;use &amp;lt;nome &lt;span class="k"&gt;do &lt;/span&gt;banco de dados&amp;gt;

db.&amp;lt;nome da coleção&amp;gt;.find&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;# retorna todos os Documentos&lt;/span&gt;
db.&amp;lt;nome da coleção&amp;gt;.find&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;# define apenas o "filtro"&lt;/span&gt;
db.&amp;lt;nome da coleção&amp;gt;.find&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;# define o "filtro" e o formato do retorno&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;use my-database

db.my-database.find&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
db.my-database.find&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
db.my-database.find&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Operadores de Comparação
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

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

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

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

&lt;p&gt;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 &lt;a href="https://www.mongodb.com/docs/manual/reference/operator/query-comparison/"&gt;documentação&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Por fim para aplicarmos os Operadores de Comparação, basta escolhermos uma ação a ser feita como, pesquisa &lt;code&gt;find&lt;/code&gt; por exemplo, e dentro do parâmetro de filtro utilizar os operadores.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;use &amp;lt;nome &lt;span class="k"&gt;do &lt;/span&gt;banco de dados&amp;gt;

db.&amp;lt;nome da coleção&amp;gt;.find&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;use my-database

db.my-database.find&lt;span class="o"&gt;({&lt;/span&gt; age: &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$gt&lt;/span&gt;: 18 &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;# busca todos os Documentos que tenha a idade maior que 18&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links Úteis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://medium.com/leroy-merlin-brasil-tech/devo-usar-nosql-e-mongodb-951693aa0d34"&gt;Devo usar NoSQL e MongoDB?&lt;/a&gt; por &lt;a href="https://medium.com/@zizacozizaco"&gt;Zizaco Zizuini&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/method/db.createCollection/#db.createCollection"&gt;&lt;code&gt;db.createCollection()&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/core/schema-validation/"&gt;Schema Validation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/operator/query-comparison/"&gt;Operadores de Comparação&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mongodb.com/docs/manual/reference/operator/projection/"&gt;Projection Operators&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;small&gt;Voltar ao top&lt;/small&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>mongodb</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Introdução ao SOLID - Princípios L e I</title>
      <dc:creator>Gabriel_Silvestre</dc:creator>
      <pubDate>Mon, 20 Jun 2022 20:50:31 +0000</pubDate>
      <link>https://dev.to/gabrielhsilvestre/introducao-ao-solid-principios-l-e-i-4cm0</link>
      <guid>https://dev.to/gabrielhsilvestre/introducao-ao-solid-principios-l-e-i-4cm0</guid>
      <description>&lt;h2&gt;
  
  
  Tabela de Conteúdos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Liskov Substitution Principle&lt;/li&gt;
&lt;li&gt;Interface Segregation Principle&lt;/li&gt;
&lt;li&gt;Links Úteis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Liskov Substitution Principle
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Recomendação
&lt;/h3&gt;

&lt;p&gt;O Princípio de Substituição de Liskov diz que devemos poder utilizar uma sub-classe, no lugar de uma super-classe. Na prática isso ocorre através da implementação de Interfaces, ou através da herança de classes, dessa forma toda a sub-classe que implementa determinada interface, ou herda de determinada super-classe, deve poder ser usada como substituto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo
&lt;/h3&gt;

&lt;p&gt;A forma mais fácil de se entender o Princípio de Substituição de Liskov é através de classes que fazem a conexão com o banco de dados, dessa forma podemos ter diversas classes, responsáveis por diversos bancos, podendo se substituírem sem a geração de efeitos colaterais &lt;em&gt;(bugs)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Pensando no contexto acima, vamos exemplificar a criação de um usuário em dois DB diferentes, o MySQL e o MongoDB. Para isso iremos criar duas classes que implementam uma mesma Interface e utilizá-las da mesma forma.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IUserRepository&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mysql2/promise&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Esse pacote foi utilizado apenas como exemplo&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;UserRepositoryMySQL&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;IUserRepository&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mysql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createPool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="cm"&gt;/* configuração da conexão */&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INSERT INTO users (name, age) VALUES (?, ?);&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongooseModels&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// pasta "fictícia"que armazena as Models do Mongoose&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;UserRepositoryMongo&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;IUserRepository&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;IUserRepository&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;IUserRepository&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;CreateUSerService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;userRepository&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IUserRepository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NextFunction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;UserRepositoryMySQL&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UserRepositoryMySQL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;UserRepositoryMongo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UserRepositoryMongo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CreateUserService&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CreateUserService&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userRepositoryMySQL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;UserRepositoryMySQL&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userRepositoryMongo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;UserRepositoryMongo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="cm"&gt;/* ---------- Criando usuário no MySQL ---------- */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createUserService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;CreateUserService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userRepositoryMySQL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="cm"&gt;/* ---------- ----------------------- ---------- */&lt;/span&gt;

&lt;span class="cm"&gt;/* ---------- Criando usuário no MongoDB ---------- */&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createUserService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;CreateUserService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userRepositoryMongo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="cm"&gt;/* ---------- ------------------------- ---------- */&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;createUserRoute&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextFunction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;createUserService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Internal server error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima criamos duas classes que lidam com DB diferentes, porém podemos utilizar qualquer uma das duas em nosso serviço de criação de usuário &lt;em&gt;&lt;code&gt;CreateUSerService&lt;/code&gt;&lt;/em&gt;, isso porque o serviço espera a Interface &lt;code&gt;IUserRepository&lt;/code&gt; e como nossas classes implementam essa Interface podem ser usadas como substitutas.&lt;/p&gt;

&lt;p&gt;Voltar ao top&lt;/p&gt;




&lt;h2&gt;
  
  
  Interface Segregation Principle
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Recomendação
&lt;/h3&gt;

&lt;p&gt;O Princípio de Segregação de Interfaces recomenda que separemos nossas Interfaces em &lt;em&gt;"blocos mínimos"&lt;/em&gt;, em outras palavras, as criemos altamente especializadas e caso surja a necessidade, podemos criar uma Interface mais completa estendendo as mais específicas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo
&lt;/h3&gt;

&lt;p&gt;O Princípio de Segregação de Interfaces é, na minha opinião, o mais simples de se entender o conceito teórico, porém o mais difícil de se aplicar em um caso real.&lt;/p&gt;

&lt;p&gt;Nosso exemplo será uma classe de serviço de uma API, ele deverá obrigatoriamente possuir o método &lt;code&gt;execute&lt;/code&gt; para executar sua tarefa e opcionalmente poderá possuir métodos de validação, como por exemplo: &lt;em&gt;validar se um email já está em uso&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Iremos utilizar generics para "tipar" o input &amp;lt;T&amp;gt; e o output &amp;lt;O&amp;gt; posteriormente&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IServiceExecute&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;O&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;O&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IServiceValidUnique&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;isUnique&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IRequest&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ICreatedUser&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;IRequest&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;UniqueUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Pick&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;IRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;RegisterUserService&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;IServiceExecute&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;IRequest&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ICreateUser&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;IServiceValidUnique&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UniqueUser&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="na"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IRepository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;isUnique&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;UniqueUSer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emailAlreadyInUse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;emailAlreadyInUse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;IRequest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ICreatedUser&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isUnique&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isUnique&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isUnique&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newUSer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;newUser&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima estamos aplicando duas Interfaces em uma única classe, isso porque cada Interface é responsável apenas por uma funcionalidade, dessa forma se precisarmos construir um serviço que não precise de validação, podemos apenas implementar a &lt;code&gt;IServiceExecute&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Obs: As Interfaces criadas junto da classe são um &lt;em&gt;"complemento"&lt;/em&gt; as outras, isso porque optei por utilizar Generics na criação das Interfaces de serviço, logo é necessário inferir seu tipo posteriormente através de tipos primitivos, &lt;code&gt;types&lt;/code&gt; ou &lt;code&gt;interfaces&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Voltar ao top&lt;/p&gt;




&lt;h2&gt;
  
  
  Links Úteis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://medium.com/@matheusbessa_44838/princ%C3%ADpios-solid-com-typescript-4f8a9d5d1ef8"&gt;Princípios SOLID com TypeScript&lt;/a&gt; por &lt;a href="https://medium.com/@matheusbessa_44838"&gt;Matheus Bessa&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/xp-inc/os-princ%C3%ADpios-do-solid-isp-princ%C3%ADpio-de-segrega%C3%A7%C3%A3o-da-interface-1822ebc802fd"&gt;Os Princípios do SOLID — ISP Princípio de segregação da interface&lt;/a&gt; por &lt;a href="https://medium.com/@jonesroberto"&gt;Jones Roberto&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/xp-inc/os-princ%C3%ADpios-do-solid-lsp-princ%C3%ADpio-da-substitui%C3%A7%C3%A3o-de-liskov-35bcff93cd86"&gt;Os Princípios do SOLID — LSP -Princípio da substituição de Liskov&lt;/a&gt; por &lt;a href="https://medium.com/@jonesroberto"&gt;Jones Roberto&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voltar ao top&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>oop</category>
      <category>typescript</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Introdução ao SOLID - Princípios S O D</title>
      <dc:creator>Gabriel_Silvestre</dc:creator>
      <pubDate>Fri, 20 May 2022 21:56:47 +0000</pubDate>
      <link>https://dev.to/gabrielhsilvestre/introducao-ao-solid-principios-s-o-d-4d36</link>
      <guid>https://dev.to/gabrielhsilvestre/introducao-ao-solid-principios-s-o-d-4d36</guid>
      <description>&lt;h2&gt;
  
  
  Tabela de Conteúdo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SOLID&lt;/li&gt;
&lt;li&gt;Single Responsibility Principle&lt;/li&gt;
&lt;li&gt;Open/Closed Principle&lt;/li&gt;
&lt;li&gt;Dependency Inversion Principle&lt;/li&gt;
&lt;li&gt;Repositório&lt;/li&gt;
&lt;li&gt;Links Úteis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  SOLID
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;SOLID, na programação, refere-se a cinco princípios que focam na escrita de um código limpo, legível e de fácil manutenção.&lt;/p&gt;

&lt;h3&gt;
  
  
  Princípios
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;S&lt;/strong&gt;ingle responsibility principle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O&lt;/strong&gt;pen/Close principle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;L&lt;/strong&gt;iskov substitution principle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I&lt;/strong&gt;nterface segregation principle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D&lt;/strong&gt;ependency inversion principle&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Aviso
&lt;/h3&gt;

&lt;p&gt;O SOLID propõe &lt;strong&gt;PRINCÍPIOS&lt;/strong&gt; a serem seguidos para o desenvolvimento de um código mais limpo, porém esses princípios não são absolutos e podem muito bem ser ignorados ou adaptados ao nosso contexto.&lt;/p&gt;

&lt;p&gt;Em outras palavras, o SOLID nos da boas recomendações a serem seguidas, mas não passa disso, &lt;strong&gt;RECOMENDAÇÕES&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Regra nenhuma, princípio nenhum e caso especial nenhum deve piorar a legibilidade ou a manutenibilidade do seu código."&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Single Responsibility Principle
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Recomendação
&lt;/h3&gt;

&lt;p&gt;O princípio da responsabilidade única recomenda que cada função ou classe realize uma única ação, dessa forma teremos nosso código divido em pequenos blocos altamente &lt;em&gt;"especializados"&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo
&lt;/h3&gt;

&lt;p&gt;Imagine que precisemos efetuar o pagamento de uma conta em outra moeda, para isso vamos precisar converter o valor para Real, acessar nossa carteira &lt;em&gt;(banco de dados)&lt;/em&gt;, recuperarmos nosso saldo e se nosso saldo for suficiente, pagar a conta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;EXCHANGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;USD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;EUR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;CAD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ICurrency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kr"&gt;keyof&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;EXCHANGE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;convertValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ICurrency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;EXCHANGE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getBalance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
    SELECT amount FROM user.wallet;
  `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mysql&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isEnough&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;personalBalance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;totalAmount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;personalBalance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;totalAmount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;payBill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;billValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;billCurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ICurrency&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myBalance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;convertedValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;convertValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;billValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;billCurrency&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isEnough&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myBalance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;convertedValue&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`Conta paga | saldo anterior &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;myBalance&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; | saldo atual &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
      &lt;span class="nx"&gt;myBalance&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;convertedValue&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`Saldo insuficiente | saldo anterior &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;myBalance&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; | saldo atual &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;myBalance&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo acima, apesar de termos omitido alguns passos, conseguimos criar um código desacoplado, legível e de fácil entendimento. Isso foi possível graças à alta especialização do código, onde cada função é responsável por executar uma única ação.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Open/Closed Principle
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Recomendação
&lt;/h3&gt;

&lt;p&gt;O princípio aberto/fechado diz que o comportamento de uma entidade deve ser aberto a extensões, mas fechado a modificações, em palavras mais simples, precisamos poder criar novos comportamentos sem alterar os já existentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo
&lt;/h3&gt;

&lt;p&gt;Imagine que uma faculdade nos pediu para desenvolvermos um software que irá validar se os candidatos conseguiram passar no vestibular para determinado curso.&lt;/p&gt;

&lt;p&gt;Para isso nós vamos precisar saber a nota do candidato, a nota de corte do curso e quantas vagas o curso possui, ou seja, temos duas regras variáveis: nota de corte e quantidade de vagas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Student&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;examNote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;course&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Course&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Course&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;openings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;minNote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;students&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;examNote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;course&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ADM&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;openings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;minNote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Joe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;examNote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;course&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ENG&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;openings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;minNote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="mi"&gt;76&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Katy&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;examNote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;66&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;course&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MED&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;openings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;minNote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rankingStudents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;students&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;students&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;examNote&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;examNote&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hasOpening&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;listLength&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;listLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;listLength&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;listLimit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hasNote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;studentNote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;minNote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;studentNote&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;minNote&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;approvedList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;ADM&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="na"&gt;ENG&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="na"&gt;MED&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;approvedStudents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;students&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Student&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;rankingStudents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;students&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;examNote&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;course&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;courseApprovedList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;course&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;hasOpening&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;courseApprovedList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;course&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;openings&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hasNote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;examNote&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;course&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;minNote&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;couse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;approvedList&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No exemplo construído logo acima, estamos montando a lista de aprovados de acordo com o número de vagas e a nota de corte de cada curso, sendo que ambos os dados são variáveis, ou seja, podemos adicionar qualquer curso que quisermos a esse software sem a necessidade de alterá-lo.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Dependency Inversion Principle
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Recomendação
&lt;/h3&gt;

&lt;p&gt;Antes de entrar mais a fundo nas recomendações, vale a citação que o princípio de inversão de dependências anda em paralelo com a arquitetura de Injeção de Dependências, essa que não será abordada aqui.&lt;/p&gt;

&lt;p&gt;O princípio de inversão de dependências consiste na implementação de uma dependência baseada em uma abstração, normalmente uma Interface, ao invés de um objeto, valor ou classe propriamente dito.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo
&lt;/h3&gt;

&lt;p&gt;Diferente dos exemplos anteriores, aqui iremos utilizar da Orientação a Objeto para exemplificar, pois acredito que seja mais fácil de entender dessa forma.&lt;/p&gt;

&lt;p&gt;Pense no seguinte cenário, temos uma pessoa e ela tem vários jogos para jogar, porém todos esses jogos são de RPG, logo suas ações são bem similares. O objetivo é criar uma classe Pessoa que possa jogar qualquer jogo de RPG.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IGameRPG&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;fight&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- retorna o dano causado&lt;/span&gt;
  &lt;span class="nx"&gt;flee&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- retorna se conseguiu fugir ou não&lt;/span&gt;
  &lt;span class="nx"&gt;levelUp&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- nível do jogo&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Gamer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;gameRpg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IGameRPG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="nx"&gt;combat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gameRpg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fight&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gameRpg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;flee&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;improve&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gameRpg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;levelUp&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;LightSouls&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;IGameRPG&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;_level&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// 10 à 100 de dano&lt;/span&gt;
  &lt;span class="nx"&gt;fight&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bate, rola, rola, bate, potion, bate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// 30% de chance de fugir&lt;/span&gt;
  &lt;span class="nx"&gt;flee&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Correeeeee&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;levelUp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome Home, ashen one. Speak thine heart's desire.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_level&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_level&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;MoOnline&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;IGameRPG&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;_level&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// 1000 à 10000 de dano&lt;/span&gt;
  &lt;span class="nx"&gt;fight&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bate, bate, bate, bate, bate, potion, bate, bate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// 60% de chance de fugir&lt;/span&gt;
  &lt;span class="nx"&gt;flee&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sair da missão&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;levelUp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Acessando novo andar...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_level&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_level&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moOnline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;MoOnline&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lightSouls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;LightSouls&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;moGamer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Gamer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;moOnline&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- a classe Gamer recebe o jogo Mo Online&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;soulsGamer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Gamer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lightSouls&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- a classe Gamer recebe o jogo Light Souls&lt;/span&gt;

&lt;span class="nx"&gt;moGamer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;combat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Bate, bate, bate, bate, bate, potion, bate, bate&lt;/span&gt;
&lt;span class="nx"&gt;soulsGamer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;combat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Bate, rola, rola, bate, potion, bate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como podemos ver no exemplo acima, a classe Gamer pode receber qualquer jogo, desde que ele seja uma implementação da abstração &lt;code&gt;IGameRPG&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Isso só é possível, pois estamos garantindo, através da interface &lt;code&gt;IGameRPG&lt;/code&gt;, que todo a classe que a implemente vai ter os métodos &lt;code&gt;fight&lt;/code&gt;, &lt;code&gt;flee&lt;/code&gt; e &lt;code&gt;levelUp&lt;/code&gt;.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Repositório
&lt;/h2&gt;

&lt;p&gt;&lt;del&gt;&lt;em&gt;Todos os exemplos&lt;/em&gt;&lt;/del&gt; demonstrados aqui se encontram nesse &lt;a href="https://github.com/gabrielh-silvestre/solid-examples"&gt;repositório&lt;/a&gt;, fique a vontade para &lt;em&gt;favoritar&lt;/em&gt;, clonar ou realizar um fork.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Este repositório está em construção. Novos exemplos serão adicionados em breve.&lt;/em&gt;&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links Úteis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://refactoring.guru/pt-br"&gt;Refactoring Guru&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cesarwilliam.medium.com/design-patterns-in-typescript-factory-d870a00b0f31"&gt;Medium - Design Patterns in TypeScript Factory&lt;/a&gt; por Cesar William&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=vAV4Vy4jfkc"&gt;YouTube RocketSeat - Princípios do SOLID em uma API REST&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=mjBsii0eiuI"&gt;YouTube RocketSeat - Construindo uma API com SOLID + TDD&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=mkx0CdWiPRA"&gt;YouTube Código Fonte TV - SOLID // Dicionário do Programador&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>oop</category>
      <category>typescript</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Introdução ao Polimorfismo</title>
      <dc:creator>Gabriel_Silvestre</dc:creator>
      <pubDate>Thu, 19 May 2022 21:21:03 +0000</pubDate>
      <link>https://dev.to/gabrielhsilvestre/polimorfismo-5aog</link>
      <guid>https://dev.to/gabrielhsilvestre/polimorfismo-5aog</guid>
      <description>&lt;h2&gt;
  
  
  Tabela de Conteúdo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Polimorfismo&lt;/li&gt;
&lt;li&gt;Sobrescrita de Métodos&lt;/li&gt;
&lt;li&gt;Classes Abstratas&lt;/li&gt;
&lt;li&gt;Métodos Estáticos&lt;/li&gt;
&lt;li&gt;Polimorfismo em Interfaces&lt;/li&gt;
&lt;li&gt;Links Úteis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Polimorfismo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;Na programação, o Polimorfismo remete a capacidade de alterar o comportamento de determinado método de uma Super Classe em qualquer uma das Sub Classes que à herdem.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que faz?
&lt;/h3&gt;

&lt;p&gt;Como dito em sua definição, permite a alteração de comportamentos de um determinado método sem alterar sua assinatura, dessa forma podemos ter o mesmo método com diferentes comportamentos a depender da classe que o implementa.&lt;/p&gt;

&lt;p&gt;Um exemplo disso seria os métodos de ciclo de vida no React, ao trabalharmos o React com classes definimos os métodos de ciclo de vida com diferentes comportamentos dependendo do componente, porém esses métodos continuam a ter o mesmo nome, parâmetros e tipo de retorno.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipos
&lt;/h3&gt;

&lt;p&gt;Existem diferentes tipos de Polimorfismo dentro da POO &lt;em&gt;(Programação Orientada a Objetos)&lt;/em&gt;, porém nesse artigo iremos abordar apenas a Sobrescrita de Métodos com TypeScript.&lt;/p&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Sobrescrita de Métodos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;É a alteração do comportamento padrão de um método da Super Classe para um comportamento mais específico de uma Sub Classe, sendo que, se não o sobrescrevermos o método manterá o comportamento definido na Super Classe.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Para sobrescrevermos um determinado método, tudo que precisamos fazer é instanciá-lo na Sub Classe e definirmos uma nova lógica.&lt;/p&gt;

&lt;p&gt;Uma obervação, os parâmetros e o tipo de retorno do método a ser sobrescrito podem ser mantidos, no intuito de padronizar o método, sendo a única alteração, a lógica interna.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="nx"&gt;move&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; se move`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Runner&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;move&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; corre`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Lazy&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;move&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; anda devagar`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;john&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;runnerJohn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Runner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lazyJohn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Lazy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;john&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;move&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// John se move&lt;/span&gt;
&lt;span class="nx"&gt;runnerJohn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;move&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// John corre&lt;/span&gt;
&lt;span class="nx"&gt;lazyJohn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;move&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// John anda devagar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Classes Abstratas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

&lt;p&gt;São classes que atuam de forma similar a Interfaces, isso porque elas não podem ser instanciadas, apenas herdadas, possibilitando ainda a criação de métodos abstratos, esses que por sua vez só podem existir em Classes Abstratas e &lt;strong&gt;devem ser implementados&lt;/strong&gt; em qualquer Sub Classe de uma Super Classe Abstrata.&lt;/p&gt;

&lt;p&gt;A diferença de Classes Abstratas e Interfaces, é que nas classes podemos definir outros métodos e atributos que não são abstratos, ou seja, podem receber funcionalidade e valores.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Para definirmos Classes/Métodos Abstratos utilizamos a palavra reservada &lt;code&gt;abstract&lt;/code&gt; antes de suas definições.&lt;/p&gt;

&lt;p&gt;Lembrando que tudo que for abstrato, não pode ser implementado, apenas definido, e nada nos impede de criarmos métodos comuns dentro de Classes Abstratas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="cm"&gt;/*
  mesmo estando em uma classe abstrata, ainda podemos criar métodos comuns
  que não precisam ser obrigatoriamente implementados nas Sub Classes.
  */&lt;/span&gt;
  &lt;span class="nx"&gt;greetings&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Eu me chamo &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="nx"&gt;move&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Runner&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;move&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="c1"&gt;// o método abstrato precisa ser implementado nas Sub Classes&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; corre`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Lazy&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;move&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; anda devagar`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;runnerJohn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Runner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lazyJohn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Lazy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;runnerJohn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;move&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// John corre&lt;/span&gt;
&lt;span class="nx"&gt;runnerJohn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;greetings&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Eu me chamo John&lt;/span&gt;

&lt;span class="nx"&gt;lazyJohn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;move&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// John anda devagar&lt;/span&gt;
&lt;span class="nx"&gt;lazyJohn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;greetings&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Eu me chamo John&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Métodos Estáticos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que são?
&lt;/h3&gt;

&lt;p&gt;São métodos que não interagem com as instancias da classe, ou seja, manipulam as informações ligadas a classe em si, não a instância.&lt;/p&gt;

&lt;p&gt;Também existem os atributos estáticos que assim como os métodos estão vinculados a classe e não as instâncias.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Para definirmos Métodos/Atributos Estáticos utilizamos a palavra reservada &lt;code&gt;static&lt;/code&gt; antes de suas definições.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;GroupMember&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;groupSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;newPerson&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;Group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addMember&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;addMember&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;groupSize&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;groupSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;GroupMember&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// 0&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;member1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;GroupMember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;GroupMember&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;member2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;GroupMember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;GroupMember&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Polimorfismo em Interfaces
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é?
&lt;/h3&gt;

&lt;p&gt;Assim como nas classes, as Interfaces também podem ser polimorfas, ou seja, ter diferentes comportamentos a depender da implementação. Esse é o comportamento padrão de toda a Interface, afinal só definimos a assinatura, parâmetros e retorno do método, enquanto a lógica interna fica por nossa conta.&lt;/p&gt;

&lt;p&gt;Porém podemos ainda utilizar das Generics criar classes e até funções ainda mais dinâmicas, dessa forma o tipo será determinado no momento de sua criação e não na definição.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sintaxe
&lt;/h3&gt;

&lt;p&gt;Como dito acima, o comportamento padrão de métodos definidos na Interface é serem polimórficos, logo sua definição continua a mesma.&lt;/p&gt;

&lt;p&gt;Já para utilizarmos Generics, tudo que precisamos fazer é nós utilizar dos símbolos de maior e menor &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;, colocando entre eles uma letra &lt;em&gt;&lt;del&gt;por convenção&lt;/del&gt;&lt;/em&gt; em maiúsculo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;IGame&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;controls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;T&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;FPSControls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;W&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;up&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;left&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;S&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;down&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;D&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;right&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;FPSGame&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;IGame&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FPSControls&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="na"&gt;controls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FPSControls&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;MOBAControls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;firstAbility&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;W&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;secondAbility&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;E&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;thirdAbility&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;R&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ultimate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;MOBAGame&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;IGame&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MOBAControls&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="na"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="na"&gt;controls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MOBAControls&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links Úteis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/2/classes.html#abstract-classes-and-members"&gt;TypeScript docs - Abstract Classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/2/classes.html#static-members"&gt;TypeScript docs - Static Members&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.typescriptlang.org/docs/handbook/2/classes.html#generic-classes"&gt;TypeScript docs - Generic Classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.devmedia.com.br/conceitos-e-exemplos-polimorfismo-programacao-orientada-a-objetos/18701"&gt;DevMedia - Polimorfismo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;small&gt;Voltar ao topo&lt;/small&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>oop</category>
      <category>typescript</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
