<?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:  Paulo Benjamin</title>
    <description>The latest articles on DEV Community by  Paulo Benjamin (@paulobenjamin).</description>
    <link>https://dev.to/paulobenjamin</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%2F914000%2Fc3322fd4-fdc0-4b32-9286-b6486c6f2a81.png</url>
      <title>DEV Community:  Paulo Benjamin</title>
      <link>https://dev.to/paulobenjamin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/paulobenjamin"/>
    <language>en</language>
    <item>
      <title>Upgrade do MongoDB - o guia definitivo.</title>
      <dc:creator> Paulo Benjamin</dc:creator>
      <pubDate>Mon, 04 Nov 2024 22:13:42 +0000</pubDate>
      <link>https://dev.to/paulobenjamin/upgrade-do-mongodb-o-guia-definitivo-2i64</link>
      <guid>https://dev.to/paulobenjamin/upgrade-do-mongodb-o-guia-definitivo-2i64</guid>
      <description>&lt;p&gt;Uma das maiores dúvidas [e medos] dos desenvolvedores, e dos DBAs relacionais que herdam a administração de servidores MongoDB, é o upgrade de versão do binário - afinal, em time que ganha não se mexe, certo? ERRADO! Manter os binários atualizados, é uma das principais recomendações da fabricante.&lt;/p&gt;

&lt;p&gt;Então, segue aqui um passo a passo que vai ajudar você a realizar o upgrade do MongoDB na maioria dos ambientes e cenários sem dor de cabeça. Claro, é impossível prever todos os possíveis cenários de implementação de MongoDB - por exemplo, não estou abordando nada envolvendo kubernetes aqui - mas fiz meu melhor para ajudar o maior número de pessoas possíveis.&lt;/p&gt;

&lt;p&gt;PS.: Originalmente eu deveria lançar dois artigos esta semana, já que não consegui lançar o da última semana a tempo, visto que minha programação é lançar um artigo por semana. Mas com a correria do MongoDB .Local de São Paulo, no último 30 de Outubro, não consegui lançar o artigo da semana passada, e vou lançar dois esta semana. Como havia prometido ha um amigo no .Local este artigo para hoje, inverti a ordem dos artigos, para cumprir com minha palavra. Espero que seja de ajuda!&lt;/p&gt;

&lt;h1&gt;
  
  
  Considerações iniciais:
&lt;/h1&gt;

&lt;p&gt;É importante verificar se os diretórios onde estão os arquivos de dados, o keyfile e verificar se o .pid foi apagado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No Ubuntu o nome do usuário de serviço do MongoDB é &lt;em&gt;mongodb&lt;/em&gt; enquanto que na maioria das outras distros é &lt;em&gt;mongod&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arquivos de dados - &lt;strong&gt;pode ser obtido no arquivo de configuração */etc/mongod.conf&lt;/strong&gt;*:

&lt;ul&gt;
&lt;li&gt;chown -R mongod:mongod &lt;/li&gt;
&lt;li&gt;chmod -R 744 &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Keyfile - &lt;strong&gt;pode ser obtido no arquivo de configuração &lt;em&gt;/etc/mongod.conf&lt;/em&gt;&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;chown mongod:mongod &lt;/li&gt;
&lt;li&gt;chmod 400 &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;.PID - &lt;strong&gt;este último varia muito de acordo com a distro:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;rm -F /var/run/mongod/*.pid&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Tendo estas informações em vista, segue o padrão para upgrade de versão do MongoDB:&lt;/p&gt;

&lt;h1&gt;
  
  
  Upgrade
&lt;/h1&gt;

&lt;p&gt;O upgrade do MongoDB, quando em replica set ou shard deve começar com os nós secundários. Nos shard ele o ideal é fazer um shard por vez. O último nó a ser atualizado é o primário.&lt;/p&gt;

&lt;p&gt;A atualização sempre deve ocorrer de versão em versão, ou seja, um MongoDB 4.4 não pode ir direto para a 8.0. Ele deve seguir o caminho 4.4 → ****5.0 → 6.0 → 7.0 → 8.0.&lt;/p&gt;

&lt;p&gt;O processo consiste em atualizar o arquivo de repositório, realizar o shutdown do MongoDB por dentro dele, verificar se ele realmente não está mais em execução, rodar o comando de upgrade, iniciar o serviço do MongoDB, e atualizar o compatibility version do MongoDB para a nova versão. Abaixo segue um script de upgrade de versão para CentOS 9.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 1: Silent Shutdown
&lt;/h2&gt;

&lt;p&gt;Para garantir que não haverá corrupção ou perda de dados é importante fazer o shutdown do Mongo corretamente, isto é, por dentro dele.&lt;/p&gt;

&lt;p&gt;Para isso precisamos logar no Mongo, localmente, com um usuário com permissão root e executar o db.shutdownServer(), executando linha a linha do código que segue:&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;# mongo admin --host localhost --port &amp;lt;27017&amp;gt; --username &amp;lt;admin&amp;gt; --password &amp;lt;admin&amp;gt;&lt;/span&gt;
...
rs01 &lt;span class="o"&gt;[&lt;/span&gt;secondary] admin&amp;gt; db.shutdownServer&lt;span class="o"&gt;()&lt;/span&gt;
rs01 &lt;span class="o"&gt;[&lt;/span&gt;secondary] admin&amp;gt; &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo 2: Verificação do shutdown
&lt;/h2&gt;

&lt;p&gt;Em seguida é bom verificar se o serviço realmente está parado. No CentOS pode ser feito executando a primeira linha do código abaixo. A saída esperada são as linhas que seguintes.&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;# systemctl status mongod&lt;/span&gt;
● mongod.service - MongoDB Database Server
   Loaded: loaded &lt;span class="o"&gt;(&lt;/span&gt;/usr/lib/systemd/system/mongod.service&lt;span class="p"&gt;;&lt;/span&gt; enabled&lt;span class="p"&gt;;&lt;/span&gt; vendor preset: disabled&lt;span class="o"&gt;)&lt;/span&gt;
   Active: inactive &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;**&lt;/span&gt;dead&lt;span class="k"&gt;**&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; since Sun 2024-03-24 04:23:19 UTC&lt;span class="p"&gt;;&lt;/span&gt; 8s ago
     Docs: https://docs.mongodb.org/manual
  Process: 32831 &lt;span class="nv"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/mongod &lt;span class="nv"&gt;$OPTIONS&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;exited, &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0/SUCCESS&lt;span class="o"&gt;)&lt;/span&gt;
 Main PID: 32831 &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;exited, &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0/SUCCESS&lt;span class="o"&gt;)&lt;/span&gt;

Mar 24 03:47:10 ip-172-31-38-118.sa-east-1.compute.internal systemd[1]: Started MongoDB Database Server.
Mar 24 03:47:10 ip-172-31-38-118.sa-east-1.compute.internal mongod[32831]: &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"t"&lt;/span&gt;:&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$date&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;:&lt;span class="s2"&gt;"2024-03-24T03:47:10.931Z"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;,&lt;span class="s2"&gt;"s&amp;gt;
Mar 24 04:23:19 ip-172-31-38-118.sa-east-1.compute.internal systemd[1]: mongod.service: Succeeded.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo 3: Atualização do repositório
&lt;/h2&gt;

&lt;p&gt;Nesse passo alteramos o repositório para o repositório da nova versão. Em distros RHEL o repositório fica em “/etc/yum.repos.d/”. O nome do arquivo sempre começa com “mongodb” e termina com “.repo”.&lt;/p&gt;

&lt;p&gt;O script abaixo já faz a substituição do conteúdo do arquivo do repositório ao ser executado. No caso deste código, o nome do arquivo de repositório, que está no fim da primeira linha é mongodb.repo.&lt;/p&gt;

&lt;p&gt;O repositório é para Linux REHL 8 (em laranja a seguir) e para a versão 8.0 do MongoDB (em azul) como mostra a 4ª linha do código: “baseurl=&lt;a href="https://repo.mongodb.org/yum/**redhat/8**/**mongodb-org/8.0**/x86_64/%E2%80%9D" rel="noopener noreferrer"&gt;https://repo.mongodb.org/yum/**redhat/8**/**mongodb-org/8.0**/x86_64/”&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Na penúltima linha também há citação da versão do MongoDB, que deve ser alterada junto com as outras informações caso o upgrade não seja para as mesmas versões, seja de Linux, seja de Mongo.&lt;/p&gt;

&lt;p&gt;No fim deste passo a passo vou juntar algumas partes que podem ser executadas em conjunto.&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;#  cat &amp;lt;&amp;lt; 'ENDOFDOC' | sudo tee /etc/yum.repos.d/mongodb.repo &lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;mongodb-org]
&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;MongoDB Repository
&lt;span class="nv"&gt;baseurl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://repo.mongodb.org/yum/redhat/8/mongodb-org/8.0/x86_64/
&lt;span class="nv"&gt;gpgcheck&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;span class="nv"&gt;gpgkey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://pgp.mongodb.com/server-8.0.asc
ENDOFDOC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Passo 4: Atualizar o binário
&lt;/h2&gt;

&lt;p&gt;Aqui fazemos diretamente a atualização do binário do MongoDB. Por segurança é bom realizar um backup do arquivo de configuração do Mongo. Para isso, podemos executar os comando a seguir no Shell.&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;# sudo cp /etc/mongod.conf /etc/mongodconf.upgradeBkp&lt;/span&gt;
&lt;span class="c"&gt;# sudo yum upgrade mongodb-org -y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para algumas versões do Mongo essa instrução pode falhar. Isso por que o nome do pacote muda em algumas versões. Você pode tentar as seguinte variações para o nome do pacote:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mongodb&lt;/li&gt;
&lt;li&gt;mongodb-org&lt;/li&gt;
&lt;li&gt;mongodb-*&lt;/li&gt;
&lt;li&gt;mongodb*&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Passo 5: Iniciar o Mongo com o novo binário
&lt;/h2&gt;

&lt;p&gt;Para iniciar o MongoDB com o novo binário usamos o &lt;em&gt;systemctl start mongod&lt;/em&gt;. E em seguida é importante utilizar o comando &lt;em&gt;systemctl status mongod&lt;/em&gt; para verificar se o serviço foi iniciado sem nenhum problema. Se tudo estiver ok, o resultado será como o mostrado a seguir:&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;# systemctl start mongod&lt;/span&gt;
&lt;span class="c"&gt;# systemctl status mongod&lt;/span&gt;
● mongod.service - MongoDB Database Server
   Loaded: loaded &lt;span class="o"&gt;(&lt;/span&gt;/usr/lib/systemd/system/mongod.service&lt;span class="p"&gt;;&lt;/span&gt; enabled&lt;span class="p"&gt;;&lt;/span&gt; vendor preset: disabled&lt;span class="o"&gt;)&lt;/span&gt;
   Active: active &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;**&lt;/span&gt;running&lt;span class="k"&gt;**&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; since Sun 2024-03-24 04:40:06 UTC&lt;span class="p"&gt;;&lt;/span&gt; 24s ago
     Docs: https://docs.mongodb.org/manual
 Main PID: 59443 &lt;span class="o"&gt;(&lt;/span&gt;mongod&lt;span class="o"&gt;)&lt;/span&gt;
   Memory: 170.8M
   CGroup: /system.slice/mongod.service
           └─59443 /usr/bin/mongod &lt;span class="nt"&gt;-f&lt;/span&gt; /etc/mongod.conf

Mar 24 04:40:06 ip-172-31-38-118.sa-east-1.compute.internal systemd[1]: &lt;span class="k"&gt;**&lt;/span&gt;Started&lt;span class="k"&gt;**&lt;/span&gt; MongoDB Database Server.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No caso de haver algum erro seguem alguns passos importantes a verificar já citados no início do arquivo:&lt;/p&gt;

&lt;h3&gt;
  
  
  Verificar permissão de diretórios e arquivos
&lt;/h3&gt;

&lt;p&gt;Todos os diretórios e arquivos citados no arquivo de configuração do MongoDB, exceto o de time zone, precisam ter como dono o usuário de serviço do MongoDB: mongod. Por isso podemos iniciar verificando todos os paths citados lá, no arquivo /etc/mongod.conf.&lt;/p&gt;

&lt;p&gt;Em geral teremos os seguinte paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;systemLog&lt;/strong&gt;: /var/log/mongodb/mongod.log&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;storage&lt;/strong&gt;: /var/lib/mongo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;security.keyFile&lt;/strong&gt;: /etc/mongodb.key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Os arquivos e diretório acima são os padrão. É importante lembrar que cada instalação pode ter estes arquivos em outros caminhos. Pensando nos caminhos padrão, a correção para os problemas de permissão seria executar o seguinte script:&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;# chmod -R mongod:mongod /var/log/mongodb/mongod.log&lt;/span&gt;
&lt;span class="c"&gt;# chown -R 744 /var/log/mongodb/mongod.log&lt;/span&gt;
&lt;span class="c"&gt;# chmod -R mongod:mongod /var/lib/mongo&lt;/span&gt;
&lt;span class="c"&gt;# chown -R 744 /var/lib/mongo&lt;/span&gt;
&lt;span class="c"&gt;# chmod mongod:mongod /etc/mongodb.key&lt;/span&gt;
&lt;span class="c"&gt;# chown 400 /etc/mongodb.key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe que a permissão do keyFile é bem restritiva, permitindo leitura somente ao usuário mongod, e nada mais.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 6: Atualizar a primária
&lt;/h2&gt;

&lt;p&gt;Após concluir a atualização de todos os nós secundários, vamos partir para atualizar o nó primário. O processo em si é basicamente o mesmo, mas há uma pequena diferença no silent shutdown: antes de executar o db.shutdownServer(), devemos forçar uma troca de nó primário com o comando stepdown, como mostra a seguir:&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;# mongo admin --host localhost --port &amp;lt;27017&amp;gt; --username &amp;lt;admin&amp;gt; --password &amp;lt;admin&amp;gt;&lt;/span&gt;
...
rs01 &lt;span class="o"&gt;[&lt;/span&gt;primary] admin&amp;gt; rs.stepDown&lt;span class="o"&gt;()&lt;/span&gt;
rs01 &lt;span class="o"&gt;[&lt;/span&gt;secondary] admin&amp;gt; db.shutdownServer&lt;span class="o"&gt;()&lt;/span&gt;
rs01 &lt;span class="o"&gt;[&lt;/span&gt;primary] admin&amp;gt; &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após a execução deste passo, você pode seguir dos passos 2 a 5.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passo 7: Atualizar o Compatibility Version do replica set
&lt;/h2&gt;

&lt;p&gt;Se você chegou aqui, é por que você terminou a atualização com sucesso. No entanto, o MongoDB continua funcionando com a versão anterior, por que ele tem algo chamado compatibility version, o que permite que atualizemos um nó para uma versão superior a dos demais sem que ele pare de funcionar ou apresente conflitos. &lt;/p&gt;

&lt;p&gt;Essa configuração também é a que permite fazer um downgrade de forma tranquila para a maioria das versões. De forma que, para finalizar esta atualização precisamos atualizar o compatibility version, o que fazemos com o código a seguir no nó primário:&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;# mongo admin --host localhost --port &amp;lt;27017&amp;gt; --username &amp;lt;admin&amp;gt; --password &amp;lt;admin&amp;gt;&lt;/span&gt;
...
rs01 &lt;span class="o"&gt;[&lt;/span&gt;primary] admin&amp;gt; db.adminCommand&lt;span class="o"&gt;({&lt;/span&gt;setFeatureCompatibilityVersion: &lt;span class="s2"&gt;"8.0"&lt;/span&gt;, 
                                      confirm: &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="o"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para confirmar se realmente estamos com o compatibility version correto, podemos executar o seguinte comando na mesma sessão do Mongo, recebendo o resultado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rs01 &lt;span class="o"&gt;[&lt;/span&gt;primary] admin&amp;gt; db.adminCommand&lt;span class="o"&gt;({&lt;/span&gt;getParameter: 1, featureCompatibilityVersion: 1&lt;span class="o"&gt;})&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;***&lt;/span&gt;featureCompatibilityVersion: &lt;span class="o"&gt;{&lt;/span&gt; version: &lt;span class="s1"&gt;'8.0'&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;,&lt;span class="k"&gt;**&lt;/span&gt;
  ok: 1,
  &lt;span class="s1"&gt;'$clusterTime'&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
    clusterTime: Timestamp&lt;span class="o"&gt;({&lt;/span&gt; t: 1660318752, i: 5 &lt;span class="o"&gt;})&lt;/span&gt;,
    signature: &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="nb"&gt;hash&lt;/span&gt;: Binary&lt;span class="o"&gt;(&lt;/span&gt;Buffer.from&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"ce0cff3621e9b089fa6d8e9a1e1efc1a1ff15dab"&lt;/span&gt;, &lt;span class="s2"&gt;"hex"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;, 0&lt;span class="o"&gt;)&lt;/span&gt;,
      keyId: Long&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"7129893797260951557"&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;,
  operationTime: Timestamp&lt;span class="o"&gt;({&lt;/span&gt; t: 1660318752, i: 5 &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;h2&gt;
  
  
  Códigos agrupados:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Atualização de repositório, upgrade do binário e restart do serviço.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após realizar o Silent Shutdown do nó, podemos executar o código abaixo que realizará a alteração do repositório, o backup do arquivo de configuração, e o upgrade do binário, bem como o restart do serviço do MongoDB.&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="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;ENDOFDOC&lt;/span&gt;&lt;span class="sh"&gt;' | sudo tee /etc/yum.repos.d/mongodb.repo 
[mongodb-org]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/8/mongodb-org/8.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://pgp.mongodb.com/server-8.0.asc
&lt;/span&gt;&lt;span class="no"&gt;ENDOFDOC

&lt;/span&gt;&lt;span class="nb"&gt;sudo cp&lt;/span&gt; /etc/mongod.conf /etc/mongodconf.upgradeBkp
&lt;span class="nb"&gt;sudo &lt;/span&gt;yum upgrade mongodb-org &lt;span class="nt"&gt;-y&lt;/span&gt;
systemctl start mongod
systemctl status mongod

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Correção das permissões dos diretórios e arquivos&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No caso de ocorrer algum erro no restart do serviço é importante verificar a permissão dos arquivos. O código abaixo é um exemplo de correção das permissões. Mas é sempre importante lembrar que os caminhos podem variar de instalação para instalação. Os caminhos que estão no script são os caminhos padrão para o CentOS. No entanto, por exemplo, nas instalações que eu faço, eu costumo mudar o diretório de log e de dados bem como o keyfile para o diretório /mongo. Dentro dele eu crio subdiretórios ssh, data, log. Com isso, eu precisaria alterar os caminhos no script abaixo.&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="nb"&gt;chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; mongod:mongod /var/log/mongodb/mongod.log
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 744 /var/log/mongodb/mongod.log
&lt;span class="nb"&gt;chmod&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; mongod:mongod /var/lib/mongo
&lt;span class="nb"&gt;chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; 744 /var/lib/mongo
&lt;span class="nb"&gt;chmod &lt;/span&gt;mongod:mongod /etc/mongodb.key
&lt;span class="nb"&gt;chown &lt;/span&gt;400 /etc/mongodb.key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Por que usar o MongoDB?</title>
      <dc:creator> Paulo Benjamin</dc:creator>
      <pubDate>Mon, 21 Oct 2024 16:54:42 +0000</pubDate>
      <link>https://dev.to/paulobenjamin/por-que-usar-o-mongodb-22pa</link>
      <guid>https://dev.to/paulobenjamin/por-que-usar-o-mongodb-22pa</guid>
      <description>&lt;p&gt;Fala ae galerinha!&lt;/p&gt;

&lt;p&gt;Nesse artigo eu decidi voltar na base de o que é o MongoDB e suas vantagens. Os outros artigos que tenho aqui no Dev.to, eu falei alguns pontos interessantes, mas a verdade é que o MongoDB possui muitas features interessantes. Nesse artigo, eu quero focar na parte de infraestrutura.&lt;/p&gt;

&lt;p&gt;A grande verdade é que os bancos de dados relacionais são um ponto de falha preocupante para as aplicações. Por mais que tenhamos uma aplicação clusterizada, ou funcionando em uma estrutura como kubernetes, por exemplo, mas o banco sempre está em uma única máquina, o que aumenta a possibilidade de uma falha no ambiente.&lt;/p&gt;

&lt;p&gt;Alguns bancos até apresentam estruturas de replicação, mas os que são de licença livre apresentam um alto nível de complexidade na configuração de um HA e DR, já os pagos, vão gerar um custo maior com licenciamento. Mas o MongoDB oferece isso como uma feature básica.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F70xt1dge2zi47idufejd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F70xt1dge2zi47idufejd.png" alt="Tecnologias de Replicação de Bancos de Dados Relacionais" width="800" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A estrutura básica do MongoDB para produção é chamada Replica Set. O Replica Set é um conjunto de maquinas que funciona em cluster, replicando os dados entre eles. O objetivo principal do Replica Set é Recuperação de Desastres (DR) e Alta Disponibilidade (HA), ou seja, manter o serviço de banco de dados sempre disponível independente de falha lógica, física, de redes, ou outras situações como atualizações de sistema ou upgrade de versão de banco de dados ou SO.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fpvjchsfz9migfinda9ji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fpvjchsfz9migfinda9ji.png" alt="MongoDB Replica Set" width="740" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No Replica Set, a aplicação se conecta a todos os nós, mas realiza as leituras e escritas, por padrão, somente com o nó primário. Como a aplicação já conhece todos os nós, no caso de uma falha, ela vai passar a transacionar automaticamente com o nó que assumir a role de primária de forma transparente, sem necessidade de qualquer interação com o banco ou aplicação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fcj3txbtl2ftvmytdq8r3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fcj3txbtl2ftvmytdq8r3.png" alt="Comunicação entre MongoDB Replica Set e MongoDB Driver" width="620" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Replica Set em ambiente produtivo deve ser composto por pelo menos três maquinas, e pode ser escalado em números ímpares. A titulo de exemplo, no MongoDB Atlas - o MongoDB como serviço hospedado na nuvem e gerido pela própria MongoDB - são oferecidos nos clusters 3, 5 ou 7 nós com o papel de DR e HA.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fsdjhetb6nxgkbwh72odt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fsdjhetb6nxgkbwh72odt.png" alt="Replica Set distribuído entre vários Data Centers" width="740" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outro ponto interessante é que diferente de outros SGBDs a configuração da replicação é bem simples. Em um cluster sem autenticação, por exemplo, basta executar o script a seguir no bash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;sudo&lt;/span&gt; &lt;span class="nx"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;mongod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conf&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;sed&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/#replication/s/#//&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;sed&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/replication/a &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s1"&gt; replSetName: "rs0"&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="sr"&gt;/etc/m&lt;/span&gt;&lt;span class="nx"&gt;ongod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tmp&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;sudo&lt;/span&gt; &lt;span class="nx"&gt;mv&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;mongod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;mongod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conf&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;sudo&lt;/span&gt; &lt;span class="nx"&gt;systemctl&lt;/span&gt; &lt;span class="nx"&gt;restart&lt;/span&gt; &lt;span class="nx"&gt;mongod&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;mongosh&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initiate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No script acima, estamos considerando um MongoDB recém instalado, sem outras configurações realizadas.&lt;/p&gt;

&lt;p&gt;Se você gostou desse artigo, não deixe da dar uma olhada nos outros artigos publicados no meu perfil no Dev.to, e fique atento para novas publicações.&lt;/p&gt;

&lt;p&gt;Inclusive, se você ficou interessado em saber como montar um Replica Set para produção, fique atento, que este será um dos meus próximos artigos!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mongodb.com/docs/manual/replication/" rel="noopener noreferrer"&gt;Replication - MongoDB Manual&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.mongodb.com/docs/v4.4/core/replica-set-architecture-geographically-distributed/" rel="noopener noreferrer"&gt;Replica Sets Distributed Across Two or More Data Centers&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Migrando para o Atlas com Live Migrate</title>
      <dc:creator> Paulo Benjamin</dc:creator>
      <pubDate>Wed, 16 Oct 2024 18:33:42 +0000</pubDate>
      <link>https://dev.to/paulobenjamin/migrando-para-o-atlas-com-live-migrate-13b8</link>
      <guid>https://dev.to/paulobenjamin/migrando-para-o-atlas-com-live-migrate-13b8</guid>
      <description>&lt;p&gt;Você já precisou migrar dados de um servidor de banco de dados para outro? Ou mover um MongoDB Replica Set ou Sharded Cluster para uma nova infraestrutura? A primeira preocupação geralmente é: quanto tempo a aplicação precisará ficar offline?&lt;/p&gt;

&lt;p&gt;Nos dias de hoje, manter uma aplicação offline é praticamente impensável para muitas empresas. Isso faz com que muitas delas acabem presas em ambientes limitados, sem escalabilidade adequada. Afinal, por mais avançado que seja um datacenter próprio, ele raramente alcança o nível de flexibilidade e crescimento que a nuvem oferece.&lt;/p&gt;

&lt;p&gt;Pensando nisso, a MongoDB disponibiliza diversas ferramentas para facilitar migrações, como o &lt;strong&gt;mongomirror&lt;/strong&gt;, o &lt;strong&gt;MongoDB Cluster-to-Cluster Sync&lt;/strong&gt; (ou &lt;strong&gt;MongoSync&lt;/strong&gt;) e o &lt;strong&gt;Live Migrate&lt;/strong&gt;. Hoje, nosso foco será o &lt;strong&gt;Live Migrate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Live Migrate&lt;/strong&gt; é, essencialmente, uma versão hospedada e gerenciada do &lt;strong&gt;MongoSync&lt;/strong&gt;, oferecida pela MongoDB via internet para simplificar a migração de dados de um servidor MongoDB (seja no Atlas ou On-Premise) para um servidor MongoDB no Atlas.&lt;/p&gt;

&lt;p&gt;Para contextualizar, segundo o próprio site da MongoDB, o &lt;strong&gt;MongoDB Atlas&lt;/strong&gt; é um conjunto integrado de serviços de dados centrado em um banco de dados na nuvem, projetado para acelerar e simplificar o desenvolvimento de aplicações. Ele oferece gerenciamento de clusters hospedados nas três principais nuvens do mercado: &lt;strong&gt;AWS&lt;/strong&gt;, &lt;strong&gt;Azure&lt;/strong&gt; e &lt;strong&gt;GCP&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F6jhc2zu3u2r34dndnk4z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F6jhc2zu3u2r34dndnk4z.png" alt="Tela de visualizacao dos Cluster no MongoDB Atlas" width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas o que torna o &lt;strong&gt;Live Migrate&lt;/strong&gt; tão especial? Ele funciona como uma integração entre dois clusters, porém, com um fluxo de dados unidirecional. Inicialmente, é feita uma cópia bruta dos dados (o chamado &lt;strong&gt;initial sync&lt;/strong&gt;), seguida pela reprodução do &lt;strong&gt;oplog&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Como o &lt;strong&gt;oplog&lt;/strong&gt; registra todas as alterações feitas em um servidor MongoDB, o &lt;strong&gt;Live Migrate&lt;/strong&gt; aplica essas modificações no servidor de destino, sincronizando os dados até que tudo o que acontece no cluster de origem seja replicado no destino.&lt;/p&gt;

&lt;p&gt;Vamos no nosso Cluster no Atlas, clicando no menu a esquerda em &lt;strong&gt;Database&lt;/strong&gt;, clicamos nos três pontos ao lado do botão &lt;strong&gt;Browse Collections&lt;/strong&gt;, e então chegamos na tela inicial do &lt;strong&gt;Live Migrate&lt;/strong&gt;, como mostrado na sequencia de imagens a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fm40c65yr8x9j8px60dqb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fm40c65yr8x9j8px60dqb.png" alt="Sequencia de telas para iniciar o Live Migrate" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Logo em seguida, nos será apresentada uma tela para preenchermos os dados do nó primário do nosso Cluster, bem como alguns IPs que precisamos liberar em nossa rede para acessar nosso replica set.&lt;/p&gt;

&lt;p&gt;Nessa tela também precisamos informar um usuário e senha, que tenha as permissões &lt;strong&gt;readAnyDatabase&lt;/strong&gt;, &lt;strong&gt;clusterMonitor&lt;/strong&gt; e &lt;strong&gt;backup&lt;/strong&gt;. No fim dessa tela, temos um botão para validar as informações que colocamos, que faz um teste de conexão, e o botão para iniciar a migração, com mostrado a continuação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F344gfqte1euj6q44wsno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F344gfqte1euj6q44wsno.png" alt="Botoes Validate e Start Migration do Live Migrate" width="800" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A vantagem é que essa replicação pode continuar pelo tempo necessário, até que você esteja pronto para concluir a migração. Nesse momento, a única ação necessária será a troca da URI de conexão do banco de dados na aplicação. E dependendo de como sua aplicação foi implantada, talvez nem seja necessário interromper seu funcionamento.&lt;/p&gt;

&lt;p&gt;Quais são as principais recomendações e exigências para os clusters durante essa migração? Para o cluster de origem, é necessário liberar o acesso aos IPs requisitados pelo Atlas. Já para o cluster de destino, é recomendável usar, pelo menos, um cluster &lt;strong&gt;Tier M60&lt;/strong&gt; no Atlas durante o &lt;strong&gt;initial sync&lt;/strong&gt; e até que o atraso (lag) entre os clusters seja zerado. Após isso, você pode redimensionar o cluster conforme o tamanho adequado ao seu ambiente.&lt;/p&gt;

&lt;p&gt;Finalizada a migração, é hora de realizar o &lt;strong&gt;cutover&lt;/strong&gt;, ou seja, encerrar a replicação entre o servidor antigo e o novo, diretamente no painel do Atlas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fmlziinpo7tnlbnps8cxr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fmlziinpo7tnlbnps8cxr.png" alt="Barra de progresso e botao de Cut Over" width="800" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto! Bom vindo ao MongoDB Atlas!&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>altaslivemigrate</category>
      <category>datamigration</category>
    </item>
    <item>
      <title>MongoDB - MQL Básico</title>
      <dc:creator> Paulo Benjamin</dc:creator>
      <pubDate>Wed, 26 Oct 2022 17:11:08 +0000</pubDate>
      <link>https://dev.to/paulobenjamin/mongodb-mql-basico-h0c</link>
      <guid>https://dev.to/paulobenjamin/mongodb-mql-basico-h0c</guid>
      <description>&lt;h2&gt;
  
  
  MQL - MongoDB Query Language
&lt;/h2&gt;

&lt;p&gt;Como em qualquer outro banco de dados, a manipulação dos dados também tem suas peculiaridades no MongoDB. Todos os bancos relacionais utilizam SQL para realizar consultas, mas a principal linguagem utilizada pelo MongoDB é a &lt;a href="https://www.mongodb.com/docs/manual/crud/" rel="noopener noreferrer"&gt;MQL - MongoDB Query Language&lt;/a&gt;. A instalação do MongoDB com fim de estudos é bem simples. Para usuários &lt;a href="https://www.mongodb.com/try/download/community" rel="noopener noreferrer"&gt;Windows&lt;/a&gt;, a instalação não foge do padrão “next - next - finish”. Já para usuário &lt;a href="https://www.mongodb.com/docs/manual/installation/" rel="noopener noreferrer"&gt;Linux&lt;/a&gt;, basta adicionar o repositório e utilizar o seu gerenciador de pacotes, assim como para o &lt;a href="https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-os-x/" rel="noopener noreferrer"&gt;MacOS&lt;/a&gt;. Quando instalamos o MongoDB, o banco vem sem segurança configurada, e o acesso é bem simples: basta digitar &lt;em&gt;mongosh&lt;/em&gt; no cmd/shell. Feito isso, você já pode começar seus estudos! No entanto, lembre-se, com essas configurações, o MongoDB deve ser utilizado somente para estudos. A utilização do MongoDB sem segurança habilitada, e sem um replicaset não é recomendada principalmente para ambientes produtivos! Dito isso, vamos em frente: Quando nos conectamos no banco de dados sem passar parâmetros adicionais somos direcionados para o database &lt;em&gt;test&lt;/em&gt;. Nossos primeiros comandos no MongoDB são bem parecidos com o de MySQL: &lt;strong&gt;&lt;em&gt;show dbs&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;show collections&lt;/em&gt;&lt;/strong&gt; e &lt;strong&gt;&lt;em&gt;use &lt;/em&gt;&lt;/strong&gt;. Aqui também podemos trabalhar alguns conceitos básicos do MongoDB. Em um &lt;em&gt;de - para&lt;/em&gt;, podemos dizer o seguinte ao compararmos o MongoDB com um banco relacional:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MongoDB&lt;/th&gt;
&lt;th&gt;Relacional&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tabela&lt;/td&gt;
&lt;td&gt;Collection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linha&lt;/td&gt;
&lt;td&gt;Documento&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Ao executar o &lt;strong&gt;&lt;em&gt;show dbs&lt;/em&gt;&lt;/strong&gt; você vai perceber que o banco de dados test - em que estamos conectados - não existe, e isso é normal para o MongoDB. O MongoDB não exige comandos do tipo DDL (Data Definition Language). Assim, para criamos um banco de dados precisamos apenas nos conectar nele, ter permissão de escrita e inserir um documento. Para fazer o teste, execute os comandos a seguir depois de se conectar ao mongo pelo mongosh:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fyijzvf9zvn3x4dw9eqev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fyijzvf9zvn3x4dw9eqev.png" alt="Criando uma collection com insertOne" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No primeiro comando, nos conectamos no banco db01. Logo em seguida, ao listar os bancos, vemos que somente os bancos admin, local e config existem. Logo em seguida você vai executar seu primeiro comando MQL e inserir um documento no banco db01, e após verificar os bancos existentes de novo, verá que o banco db01 agora existe. Os comandos utilizados para CRUD no MongoDB seguem o seguinte padrão: db..({…}). Os comandos para CRUD são os seguintes: insertOne, insertMany, findOne, find, updateOne, updateMany, deleteOne e deleteMany. Todos eles recebem pelo menos um documento como parâmetro. Destes comandos, os que terminam com &lt;em&gt;Many&lt;/em&gt; permitem trabalhar com operações do tipo &lt;em&gt;bulk&lt;/em&gt; - que são bem mais performáticas ao se trabalhar com grandes massas de dados. Abaixo seguem algumas peculiaridades dos comandos acima: ## insertOne e insertMany&lt;/p&gt;

&lt;p&gt;Estes comandos gravam dados em um &lt;em&gt;namespace&lt;/em&gt; (banco.coleção). Quando o namespace não existe, ele é automaticamente criado. O insertOne recebe um documento, enquanto o insertMany recebe um array de documentos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//insertOne
db.test.insertOne(
    {
        'comando': 'insertOne',
        'valor': 1
    }
)

//insertMany
db.test.insertMany(
    [
        {
            'comando': 'insertMany',
            'valor': 1
        },
        {
            'comando': 'insertMany',
            'valor': 2
        }
    ]
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após executar esses comandos no seu shell, você pode executar o bloco abaixo, de finds. Nos demais comandos, vou adicionar um find sem filtros para que vocês possam visualizar tudo que está acontecendo com os documentos do banco de vocês.&lt;/p&gt;

&lt;h2&gt;
  
  
  findOne e find
&lt;/h2&gt;

&lt;p&gt;Com estes comandos podemos selecionar documentos de uma coleção. Ambos recebem um documento com os campos e valores que queremos usar como filtro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//findOne
db.test.findOne(
    {
        'valor': 1
    }
)

//find com filtro
db.test.find(
    {
        'valor': 1
    }
)

//find sem filtros para retornar tudo de uma coleção
db.test.find()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  updateOne e updateMany
&lt;/h2&gt;

&lt;p&gt;O updateOne e updateMany são os únicos que precisam de dois documentos para funcionar, já que o primeiro será o filtro, e o segundo contém as alterações que devem ser realizadas. É bom lembrar que se não utilizarmos operadores como o $set, o documento anterior será totalmente substituído pelo conteúdo do segundo documento que estamos enviando nos comandos de update. No exemplo abaixo utilizamos o operador $set para alterar o valor somente de um campo do documento, e não o documento todo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//updateOne
db.test.updateOne(
    {
        'insertOne': 1
    },
    {
        $set: {
            'comando': 'updateOne'
        }
    }
)

//find sem filtro
db.test.find()

//updateMany
db.test.updateMany(
    {
        'comando': 'insertMany'
    },
    {
        $set: {
            'comando': 'updateMany'
        }
    }
)

//find sem filtro
db.test.find()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de seguirmos a diante, vamos executar um aggregate (abordaremos mais detalhes sobre esse tipo de comandos em outro posto) para poder criar um cenário legal para testarmos o delete:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.test.aggregate(
    [
        {
            $project: {
                _id: 0
            }
        },{
            $set: {
                'aggregate': true
            }
        },{
            $merge: {
                into: 'test',
                whenNotMatched: 'insert'
            }
        }
    ]
)

//find sem filtro
db.test.find()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe que agora você terá 6 documentos, sendo que 3 deles possuem o campo &lt;em&gt;aggregate&lt;/em&gt; com o valor &lt;em&gt;true&lt;/em&gt;. Agora podemos seguir!&lt;/p&gt;

&lt;h2&gt;
  
  
  deleteOne e deleteMany
&lt;/h2&gt;

&lt;p&gt;Por último, temos os documentos de deleção do MongoDB: deleteOne e deleteMany&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db.test.deleteOne(
    {
        aggregate: {
            $exists: false
        },
        valor: 2
    }
)

//find sem filtro
db.test.find()

db.test.deleteMany(
    {
        aggregate: {
            $exists: true
        },
        valor: 1
    }
)

//find sem filtro
db.test.find()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Extra
&lt;/h2&gt;

&lt;p&gt;O MongoDB também tem mais um comando que permite realizar inserções, deleções e atualizações: o bulkWrite. Ao invés de receber um filtro, ou um array de documentos, ele recebe um array de operações. Ou seja, podemos enviar ao banco vários comandos de escrita misturados. Mas vamos deixar isso para um papo futuro.&lt;/p&gt;

&lt;p&gt;Agora você já pode começar a treinar CRUD com MongoDB!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>MongoDB - O banco NoSQL mais utilizado no mundo</title>
      <dc:creator> Paulo Benjamin</dc:creator>
      <pubDate>Wed, 19 Oct 2022 14:12:57 +0000</pubDate>
      <link>https://dev.to/paulobenjamin/mongodb-o-banco-nosql-mais-utilizado-no-mundo-28fj</link>
      <guid>https://dev.to/paulobenjamin/mongodb-o-banco-nosql-mais-utilizado-no-mundo-28fj</guid>
      <description>&lt;p&gt;O MongoDB é um banco de dados NoSQL que foi lançado em 2009. De lá pra cá, este banco de dados tem crescido em utilização e em popularidade. Hoje já estamos na versão 6.0 dele. Mas, qual a diferença dela para outros bancos de dados como SQL Server, Oracle ou MySQL?&lt;br&gt;
O MongoDB é um banco de dado que não armazena os dados em um formato tabelar e relacional. Os documentos são armazenados em "documentos".&lt;br&gt;
Os documentos são expressos no tão conhecido formato JSON, e armazenados no formato BSON (que não significa um JSON armazenado em binário, mas sim uma serialização binária de json). Este formato armazena os dados de maneira tipada, diferente do JSON.&lt;br&gt;
Dessa forma, informações que seriam expressas assim em um banco relacional:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;id&lt;/th&gt;
&lt;th&gt;nome&lt;/th&gt;
&lt;th&gt;titulo&lt;/th&gt;
&lt;th&gt;email&lt;/th&gt;
&lt;th&gt;linkedin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Paulo Benjamin&lt;/td&gt;
&lt;td&gt;Consultor MongoDB&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:paulo.benjamin@phdatatech.com"&gt;paulo.benjamin@phdatatech.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;linkedin.com/in/pcjuniorrj&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Passam a ser expressas assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    id: 1,
    nome: "Paulo Benjamin",
    titulo: "Consultor MongoDB",
    email: "paulo.benjamin@phdatatech.com",
    linkedin: "linkedin.com/in/pcjuniorrj"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A princípio parece simplesmente uma mudança na forma como os dados são visualizados e armazenados, mas essa diferença é bem mais profunda. Com essas alterações, podemos utilizar toda a flexibilidade do JSON para guardar as informações. Assim, o documento acima poderia ser convertido para o seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    id: 1,
    nome: "Paulo Benjamin",
    titulo: "Consultor MongoDB",
    contato: [
        {tipo: "email", contato: "paulo.benjamin@..."},
        {tipo: "linkedin", contato: "@pcjuniorrj"}
    ],
    stacks: [
        "MongoDB",
        "SQL Server",
        "Oracle",
        "MySQL",
        "Redis"
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para armazenar o documento acima, seriam necessárias pelo menos 3 tabelas. E aí começamos a ter vantagens na utilização do MongoDB. As consultas passam a ser mais rápidas já que evitamos a utilização de &lt;em&gt;joins&lt;/em&gt; a todo custo. A comparação entre os dados armazenados e os objetos de uma aplicação se tornam mais fáceis.&lt;br&gt;
Outro ponto é que o MongoDB permite uma flexibilidade muito grande do esquema. Assim, para converter o primeiro documento no segundo modelo, basta um update, o que facilita muito a implementação e evoluções do esquema de dados de uma aplicação.&lt;br&gt;
No entanto, estas facilidades vêm com responsabilidades. É importante lembrar que o MongoDB não vai criticar a inserção de um documento sem um campo, ou com o nome do campo errado. Essa abstração e responsabilidade, assim como outras, ficam a cargo da aplicação.&lt;br&gt;
Por isso, Devs, lembrem-se: "Com grandes poderes vem grandes responsabilidades" - Tio Ben/Tia May. &lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
