<?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: Pedro Victor</title>
    <description>The latest articles on DEV Community by Pedro Victor (@pedrovictoroc).</description>
    <link>https://dev.to/pedrovictoroc</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%2F364828%2F5a86e137-7fd1-45b0-8786-4351aecd1f50.jpeg</url>
      <title>DEV Community: Pedro Victor</title>
      <link>https://dev.to/pedrovictoroc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pedrovictoroc"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Pedro Victor</dc:creator>
      <pubDate>Tue, 07 Jan 2025 14:39:24 +0000</pubDate>
      <link>https://dev.to/pedrovictoroc/-2c3n</link>
      <guid>https://dev.to/pedrovictoroc/-2c3n</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/cinthia3301andrad" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F784791%2F9393d79b-886b-4a61-bb2f-e353704685e0.jpeg" alt="cinthia3301andrad"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/cinthia3301andrad/bem-vindo-ao-desenvolvimento-web-um-guia-pratico-para-quem-esta-comecando-do-zero-1fp7" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Bem-vindo ao desenvolvimento Web: Um guia prático para quem está começando do zero&lt;/h2&gt;
      &lt;h3&gt;Cinthia Andrade ・ Jan 6 '25&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#web&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#html&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Como funcionam as Tries</title>
      <dc:creator>Pedro Victor</dc:creator>
      <pubDate>Tue, 21 Dec 2021 16:38:48 +0000</pubDate>
      <link>https://dev.to/pedrovictoroc/como-funcionam-as-tries-5f55</link>
      <guid>https://dev.to/pedrovictoroc/como-funcionam-as-tries-5f55</guid>
      <description>&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
TL;DR&lt;a&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
O problema inicial&lt;a&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
Como comparamos strings&lt;a&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
Uma ideia alternativa&lt;a&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
Idealizando um "autocomplete"&lt;a&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
Algumas otimizações&lt;a&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
Conclusão&lt;a&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Tries são estruturas de dados que assumem a forma de árvore de busca, podendo um nó ter diversos filhos, mas nunca mais de um pai. A chave de cada nó geralmente é composta por um único caractere, o caminho a partir da raiz até um determinado nó forma uma palavra, ou parte de uma, inserida na Trie.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problema inicial
&lt;/h2&gt;

&lt;p&gt;Imagine que estamos desenvolvendo um jogo cuja meta do jogador é escrever todas as palavras que conhece, ganha quem souber mais palavras! Uma forma de contabilizarmos as palavras inseridas pode ser: a cada inserção verificamos se a palavra já foi inserida em uma lista, caso não tenha sido então adicionamos.&lt;br&gt;
De fato essa solução funciona, mas será que essa é realmente a mais interessante?&lt;/p&gt;

&lt;h2&gt;
  
  
  Um método geral para comparar strings
&lt;/h2&gt;

&lt;p&gt;Antes de tudo, vamos entender como geralmente comparamos strings. Para isso, utilizando como linguagem o JavaScript e &lt;a href="https://javascript.info/comparison#string-comparison" rel="noopener noreferrer"&gt;este link como fonte&lt;/a&gt; temos uma forma geral de comparar strings:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compare o primeiro caractere de cada string&lt;/li&gt;
&lt;li&gt;Caso o valor de &lt;a href="https://unicode.org/charts/" rel="noopener noreferrer"&gt;Unicode&lt;/a&gt; da primeira string seja maior ou menos que o da segunda, sabemos que são strings diferentes e terminamos&lt;/li&gt;
&lt;li&gt;Caso sejam iguais, continue com o segundo caractere&lt;/li&gt;
&lt;li&gt;Efetue a mesma etapa incrementando o índice do caractere analisado até finalizar a string&lt;/li&gt;
&lt;li&gt;Caso cheguemos ao final da string e seus caracteres sejam iguais, sabemos com certeza que ambas as cadeias de caracteres são iguais&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Uma ideia alternativa
&lt;/h2&gt;

&lt;p&gt;A essa altura entendemos então que ao tentar adicionar uma palavra na lista que comentamos anteriormente não iremos apenas comparar ela N vezes, com N sendo a quantidade de palavras inseridas anteriormente na lista, mas por baixo dos panos também iremos comparar letras, palavra por palavra, de todos os elementos da lista.&lt;/p&gt;

&lt;p&gt;Temos então uma ideia! E se montarmos um conjunto com as palavras que começam com a letra &lt;strong&gt;"C"&lt;/strong&gt;? Nesse caso, quando quisermos adicionar a palavra &lt;strong&gt;"Car"&lt;/strong&gt; apenas temos que comparar com as palavras dentro deste conjunto, reduzindo as comparações com palavras que começam com outras letras. Podemos aplicar o mesmo raciocínio e, dessa vez, construir o conjunto das palavras que começa com &lt;strong&gt;"Ca"&lt;/strong&gt;, e assim caso este esteja vazio sabemos que a palavra &lt;strong&gt;"Car"&lt;/strong&gt; não foi inserida anteriormente e, por tanto, basta adicionar!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09k6cgwf6m20syjjekqj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09k6cgwf6m20syjjekqj.png" alt="Uma árvore com raiz a letra C, filho esquerdo com chave a letra A, que possui filho com a letra R como chave, todos com fundo verde e letra branca, representando a palavra inserida. A raiz possui filho direito com chave O e dois filhos, com chave M e R respectivamente, suas cores são fundo branco e letra preta." width="377" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note que o conjunto anterior continha então as palavras "Com" e "Cor", agora, inserimos "Car".&lt;/p&gt;

&lt;h2&gt;
  
  
  Um caso de uso mais complexo
&lt;/h2&gt;

&lt;p&gt;Imagine que um programador esteja digitando em seu editor de texto e você deseja fornecer uma opção de "autocomplete" que mostra as palavras-chave que o usuário pode estar querendo digitar. Nesse caso, temos &lt;strong&gt;C&lt;/strong&gt;, um conjunto de palavras-chave da linguagem, &lt;strong&gt;S&lt;/strong&gt; um "armazém" de Tries que contém essas palavras-chave e &lt;strong&gt;W&lt;/strong&gt;, a palavra que o programador começou a digitar. Podemos, portanto, selecionar em &lt;strong&gt;S&lt;/strong&gt; (nosso "armazém") a Trie cuja raiz tem chave igual à primeira letra de &lt;strong&gt;W&lt;/strong&gt; (palavra que o programador digitou), chamaremos esta de &lt;strong&gt;T&lt;/strong&gt; (entenda apenas como sendo a Trie que usaremos), e então percorremos a cada letra de &lt;strong&gt;W&lt;/strong&gt; um nó em &lt;strong&gt;T&lt;/strong&gt; e, ao fim de &lt;strong&gt;W&lt;/strong&gt;, percorremos essa sub-árvore  com raiz na última letra da palavra digitada e mostramos todas as palavras que podem ser formadas a partir dela!&lt;/p&gt;

&lt;p&gt;Parece complicado né? Mas na verdade não é! Entenda que nosso armazém é na verdade a raiz de uma Trie! Estranho né? Mas apenas pense que seria o equivalente de termos como chave nada mais nada menos que a string vazia, afinal, ela é prefixo de toda palavra!&lt;/p&gt;

&lt;p&gt;Sobre o restante, nada mais é do que percorrer uma árvore a partir de um certo nó, o que podemos facilmente fazer com um pouquinho de conhecimento sobre a estrutura de dados árvore!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fills9uy1q7no76emo143.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fills9uy1q7no76emo143.png" alt="Uma trie com nó inicial " width="400" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse exemplo, suponha que o programador digitou apenas "L", dessa forma podemos percorrer recursivamente a Trie e obter para o nosso "autocomplete" as palavras-chave "Let", "List", "Length". Suponha agora que a entrada seja "Le", nesse caso teremos como retorno para "autocomplete" as palavras-chave "Let" e "Length". Com esse exemplo fica fácil saber como implementar, né?&lt;/p&gt;

&lt;h2&gt;
  
  
  Algumas otimizações
&lt;/h2&gt;

&lt;p&gt;Suponha que no exemplo da imagem anterior tínhamos a palavra "Como", ao invés de "Com", dessa forma, naturalmente, poderíamos ter nossa Trie se adicionássemos um novo nó com a letra "o" como chave, correto? Sim!&lt;/p&gt;

&lt;p&gt;Mas será que isso realmente é necessário? Algumas implementações utilizam uma breve otimização no quesito memória, como o nó de chave "m" não tem mais de um filho, poderíamos concatenar ambas as chaves e ter um nó de chave "mo". Isso traz alguma complexidade para a implementação, entretanto, representa um nó a menos na memória. &lt;/p&gt;

&lt;p&gt;Tries podem ser implementadas de diversas formas, com diversos nomes, como: Árvore Prefixo, Árvore Sufixo e Árvore Patricia, cada um com seus detalhes de implementação e otimizações, é aconselhável ler o que cada uma tem a oferecer antes de implementar!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Com isso vemos uma nova forma de comparar strings, sem precisarmos percorrer repetidamente uma lista inteira, ou utilizar "índices únicos" em bancos de dados. Obviamente temos casos específicos para seu uso, o intuito deste artigo é apontar para uma nova abordagem, bem como uma nova estrutura de dados, caso algo não tenha ficado claro ou notou algum erro, não deixe de avisar!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>datastructures</category>
      <category>trie</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Filtrando campos retornados em buscas com MongoDB</title>
      <dc:creator>Pedro Victor</dc:creator>
      <pubDate>Sat, 11 Apr 2020 20:58:33 +0000</pubDate>
      <link>https://dev.to/pedrovictoroc/filtrar-campos-retornados-em-buscas-com-mongodb-5b3k</link>
      <guid>https://dev.to/pedrovictoroc/filtrar-campos-retornados-em-buscas-com-mongodb-5b3k</guid>
      <description>&lt;h2&gt;
  
  
  Filtrando campos em SQL
&lt;/h2&gt;

&lt;p&gt;Se você já usou bancos relacionais, com certeza já se deparou com as famosas querys de busca, coisas como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;select nome, idade from usuario
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muito comuns e úteis, já que nem sempre queremos todas as colunas de uma tabela.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas e no MongoDB ?
&lt;/h2&gt;

&lt;p&gt;Bom, geralmente aprendemos em vários eventos e cursos as funções básicas para fazer o famoso &lt;strong&gt;CRUD&lt;/strong&gt; &lt;em&gt;(Create, read, update, delete)&lt;/em&gt;, com &lt;strong&gt;mongoose&lt;/strong&gt;, que são ótimos para dar uma base prática a quem acaba de conhecer a tecnologia e dar ideias de desafios para quem já domina a tecnologia, nesses cursos aprendemos a fazer buscar com condições como essa:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&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;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&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;Nome do alvo&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;E como sabemos, isso retorna todo o Schema (modelo especificado por nós do documento) do usuário, cujo nome seja "Nome do alvo". Vamos supor que esse seja o Schema do User:&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="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;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Schema&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="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="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="na"&gt;unique&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="na"&gt;githubUser&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="kc"&gt;true&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="na"&gt;unique&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="na"&gt;bio&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="kc"&gt;false&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="na"&gt;unique&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="na"&gt;avatar_url&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="kc"&gt;true&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="na"&gt;unique&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="na"&gt;techs&lt;/span&gt;&lt;span class="p"&gt;:&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="na"&gt;githubFollowers&lt;/span&gt;&lt;span class="p"&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;span class="na"&gt;githubFollowing&lt;/span&gt;&lt;span class="p"&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;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suponha que em dado momento da nossa aplicação, somente nos importe buscar os dados { name, githubUser, avatar_url }, não faz sentido buscarmos todos os dados se apenas queremos estes!&lt;/p&gt;

&lt;h2&gt;
  
  
  O segundo parâmetro do método find
&lt;/h2&gt;

&lt;p&gt;Para resolvermos esse problema da requisição desnecessária de campos, podemos usar o segundo parâmetro do métodos find, chamado &lt;strong&gt;Projection&lt;/strong&gt;, um JSON em que podemos filtrar quais campos queremos que sejam retornados, ou não, exemplo:&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="cm"&gt;/*
  O 1 indica a inclusão do campo no retorno da query
  os demais campos não serão inclusos
*/&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="nx"&gt;githubUser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="nx"&gt;avatar_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cm"&gt;/*
  O 0 indica a exclusão do campo no retorno da query
  os demais campos serão inclusos
*/&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="na"&gt;bio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;techs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;githubFollowers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;githubFollowing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  IMPORTANTE: NÃO SE PODE MISTURAR 1s E 0s NA MESMA PROJEÇÃO!
&lt;/h3&gt;

&lt;p&gt;Assim, temos o mesmo resultado nos dois casos! Filtramos então os campos para recebermos { name, githubUser, avatar_url }!&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas como ficaria isso no código? Como se parece a resposta dessa query?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Query&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&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;Dev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&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;Algum nome&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;githubUser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;avatar_url&lt;/span&gt;&lt;span class="p"&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;//Resposta&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_id&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;Array do ID&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;name&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;Pedro Victor&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;githubUser&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;stormsamurai1&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;avatar_url&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;https://avatars2.githubusercontent.com/u/37453874?v=4&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;h2&gt;
  
  
  PROBLEMA DE VIRTUALS!!!
&lt;/h2&gt;

&lt;p&gt;Se você usa algum campo virtual no seu modelo, provavelmente vai se deparar com um problema: &lt;strong&gt;Os campos virtuais não são afetados.&lt;/strong&gt;&lt;br&gt;
Bem, isso ocorre por eles não persistirem no banco de dados, e, por isso, não temos tanto controle, mas isso não será um problema, podemos adicionar uma função a mais para remover esses campos e resolver o empecilho. &lt;strong&gt;Trata-se da função lean()&lt;/strong&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="c1"&gt;//Antes do lean&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_id&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;Array do ID&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;name&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;Pedro Victor&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;githubUser&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;stormsamurai1&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;avatar_url&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;https://avatars2.githubusercontent.com/u/37453874?v=4&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;virtual_field&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;virtual result&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;id&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;5e7aa3fc0cf9ea14d47fa461&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 javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//Query atualizada&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&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;Dev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;githubUser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;avatar_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;lean&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="c1"&gt;//Resultado atualizado&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;_id&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;Array do ID&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;name&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;Pedro Victor&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;githubUser&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;stormsamurai1&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;avatar_url&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;https://avatars2.githubusercontent.com/u/37453874?v=4&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;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Apesar de ser um tema básico, é algo que senti vontade de escrever, via poucas pessoas utilizando essas funções e vi uma boa oportunidade de explorar o tema, pesquisar e começar com um projeto de escrita sobre coisas que aprendi. Qualquer dúvida que tenha, entre em contato! Críticas construtivas? Por favor, diga! É isto, obrigado a quem leu!&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>mongoose</category>
      <category>javascript</category>
      <category>node</category>
    </item>
  </channel>
</rss>
