> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devinenterprise.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Migrar do MongoDB para Postgres

export const UseCaseHero = ({title, description, prompt, category, features, devinUrl, agent, intent, playbookId, type}) => {
  const encodedPrompt = encodeURIComponent(prompt || '');
  const tag = 'docs-use-case-gallery';
  const utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=hero-cta';
  const agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  const devinHref = type === 'schedule' ? 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + (prompt ? '&prompt=' + encodedPrompt : '') : type === 'review' ? 'https://app.devin.ai/review?' + utm : agent === 'ada' ? 'https://app.devin.ai/search?' + utm + '&noSubmit=true' + (prompt ? '&prompt=' + encodedPrompt : '') : devinUrl ? devinUrl.includes('?') ? devinUrl + '&' + utm + agentParams : devinUrl + '?' + utm + agentParams : prompt ? 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encodedPrompt : 'https://app.devin.ai/?' + utm + agentParams;
  const buttonLabel = type === 'schedule' ? 'Schedule in Devin ↗' : type === 'review' ? 'Set Up Devin Review ↗' : agent === 'advanced' ? 'Try in Devin ↗' : agent === 'dana' ? 'Try in Dana ↗' : agent === 'ada' ? 'Try in Ask Devin ↗' : 'Try in Devin ↗';
  const featureList = features ? features.split(',').map(f => f.trim()) : [];
  return <div className="uc-hero">
      <div className="uc-hero-inner">
        <div className="uc-hero-left">
          <h1 className="uc-hero-title">{title}</h1>
          <p className="uc-hero-desc">{description}</p>
          <div>
            <a href={devinHref} target="_blank" rel="noopener noreferrer" className="try-in-devin-btn">
              {buttonLabel}
            </a>
          </div>
        </div>
        <div className="uc-hero-meta">
          <div className="uc-meta-item">
            <span className="uc-meta-label">Author</span>
            <span className="uc-meta-value">Cognition</span>
          </div>
          <div className="uc-meta-item">
            <span className="uc-meta-label">Category</span>
            <span className="uc-meta-value">{category}</span>
          </div>
          {featureList.length > 0 && <div className="uc-meta-item">
              <span className="uc-meta-label">Features</span>
              <span className="uc-meta-value">{featureList.join(', ')}</span>
            </div>}
        </div>
      </div>
    </div>;
};

export const PromptBlock = ({children, type, agent, intent, playbookId}) => {
  var utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=prompt-block';
  var tag = 'docs-use-case-gallery';
  var agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  var label = type === 'schedule' ? 'Schedule in Devin' : type === 'playbook' ? 'Create Playbook' : type === 'knowledge' ? 'Add to Knowledge' : agent === 'advanced' ? 'Try in Devin' : agent === 'dana' ? 'Try in Dana' : agent === 'ada' ? 'Try in Ask Devin' : 'Try in Devin';
  var buildUrl = function (text) {
    var encoded = encodeURIComponent(text);
    if (type === 'schedule') return 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + '&prompt=' + encoded;
    if (type === 'playbook') return 'https://app.devin.ai/settings/playbooks/create?' + utm + '&body=' + encoded;
    if (type === 'knowledge') return 'https://app.devin.ai/knowledge?' + utm + '&body=' + encoded;
    if (agent === 'ada') return 'https://app.devin.ai/search?' + utm + '&noSubmit=true&prompt=' + encoded;
    return 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encoded;
  };
  const ref = React.useRef(null);
  const [href, setHref] = React.useState('#');
  React.useEffect(() => {
    if (!ref.current) return;
    var codeEl = ref.current.querySelector('pre code');
    if (codeEl) {
      var text = codeEl.textContent.trim();
      if (text) setHref(buildUrl(text));
    }
    var header = ref.current.querySelector('[data-component-part="code-block-header"]');
    if (header && !header.querySelector('.prompt-block-devin-link')) {
      var link = document.createElement('a');
      link.href = href;
      link.target = '_blank';
      link.rel = 'noopener noreferrer';
      link.className = 'prompt-block-devin-link';
      link.style.cssText = 'display:inline-flex;align-items:center;gap:6px;text-decoration:none;color:#fff;font-size:11px;font-weight:500;padding:4px 10px;border-radius:6px;white-space:nowrap;background:#317CFF;transition:background 0.2s;margin-left:8px;';
      link.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg> ' + label;
      link.onmouseenter = function () {
        link.style.background = '#2968D9';
      };
      link.onmouseleave = function () {
        link.style.background = '#317CFF';
      };
      header.appendChild(link);
    }
    var existingLink = ref.current.querySelector('.prompt-block-devin-link');
    if (existingLink && href !== '#') existingLink.href = href;
  });
  return <div className="prompt-block" ref={ref}>{children}</div>;
};

<UseCaseHero title="Migrar de MongoDB para Postgres" description="Migre sua aplicação de MongoDB para Postgres — converta esquemas de documentos em tabelas relacionais, reescreva consultas para usar um cliente do Postgres e migre seus dados." prompt="Migre nossa aplicação de MongoDB para Postgres. Analise as coleções e os esquemas de documentos do MongoDB existentes, converta-os em tabelas no Postgres com relacionamentos adequados, reescreva todas as consultas ao banco de dados para usar um cliente do Postgres (por exemplo, Prisma, Drizzle ou node-postgres), crie um script de migração de dados e verifique se tudo funciona de ponta a ponta." category="Migrações" features="Playbooks" agent="devin" intent="create" />

<div className="uc-detail-wrapper">
  <Tip>Não quer configurar isso manualmente? Cole um link para esta página em uma sessão do Devin e peça que ele configure tudo para você.</Tip>

  <Steps>
    <Step title="Defina o esquema do Postgres">
      Analise suas coleções MongoDB e projete equivalentes relacionais. Se seus dados envolvem várias coleções com relacionamentos, crie primeiro um Diagrama Entidade-Relacionamento (DER) para validar as decisões de normalização antes de escrever qualquer SQL.

      Padrões principais de mapeamento:

      * **Document IDs**: Converta campos `_id` do MongoDB em chaves primárias UUID ou SERIAL
      * **Nested objects**: Desdobre em tabelas separadas com relacionamentos de chave estrangeira
      * **Arrays**: Use tipos de array do Postgres ou tabelas de junção separadas
      * **Embedded documents**: Extraia para tabelas relacionadas com normalização adequada

      <PromptBlock>
        ```txt Analise o schema do MongoDB e projete tabelas Postgres theme={null}
        Analise nossas coleções MongoDB existentes e os schemas de documentos.
        Para cada coleção:
        1. Projete uma tabela equivalente no PostgreSQL com tipos de coluna adequados
        2. Identifique relacionamentos e crie chaves estrangeiras
        3. Desdobre objetos aninhados em tabelas separadas quando apropriado
        4. Crie um DER mostrando todas as entidades e relacionamentos
        5. Converta ObjectIds do MongoDB em UUIDs
        6. Escreva a migração SQL para criar o schema
        ```
      </PromptBlock>

      Quando o schema estiver pronto, configure a segurança: crie roles no Postgres com privilégios apropriados e habilite políticas de segurança em nível de linha (Row Level Security, RLS) nas tabelas que precisarem de controle de acesso em nível de linha.
    </Step>

    <Step title="Migrar consultas e dependências de back-end">
      Substitua seu driver do MongoDB (por exemplo, `mongoose`, `mongodb`) por uma biblioteca cliente para Postgres — Prisma, Drizzle, TypeORM ou `node-postgres`, dependendo da sua stack. Atualize sua configuração de ambiente com `DATABASE_URL` ou credenciais de conexão equivalentes.

      Padrões de migração de consultas:

      * **Operações de busca (find)** → consultas SQL `SELECT` ou métodos ORM `.findMany()` / `.select()`
      * **Pipelines de agregação** → `JOIN`s, `GROUP BY`, subconsultas, funções de janela
      * **Updates** → comandos SQL `UPDATE`
      * **Inserts** → SQL `INSERT` ou métodos de inserção em lote (bulk insert)

      <PromptBlock>
        ```txt Migrate backend from MongoDB to Postgres theme={null}
        Substitua nosso driver MongoDB por [Prisma / Drizzle / node-postgres].
        Para cada módulo de backend:
        1. Substitua imports do MongoDB e a configuração de conexão
        2. Reescreva todas as consultas para usar o novo cliente Postgres
        3. Atualize o tratamento de erros (por exemplo, violações de restrição de unicidade são o código de erro Postgres 23505)
        4. Preserve todos os formatos de resposta de API existentes
        5. Execute os testes após cada módulo para verificar que nada deixou de funcionar
        ```
      </PromptBlock>

      Se seu app usa autenticação JWT personalizada com um repositório de usuários em MongoDB, atualize as consultas de busca de usuários para usar Postgres mantendo a mesma lógica de geração e validação de tokens.
    </Step>

    <Step title="Atualize a camada de serviço do frontend">
      Atualize os serviços de front-end para lidar com quaisquer alterações na estrutura dos dados decorrentes da migração — mais comumente `_id` se tornando `id`. Mantenha as assinaturas existentes dos métodos de serviço para que não seja necessário alterar os componentes.

      * Atualize os serviços de autenticação se o fluxo de autenticação for alterado
      * Ajuste o tratamento de requisições/respostas do cliente HTTP para as novas estruturas de dados
      * Atualize os guards de rota e resolvers se os padrões de obtenção de dados tiverem mudado
    </Step>

    <Step title="Migrar dados e executar testes de ponta a ponta">
      Exporte seus dados do MongoDB, transforme-os para corresponder ao esquema do Postgres e importe-os.

      <PromptBlock>
        ```txt theme={null}
        Crie um script de migração de dados
        Escreva um script de migração que:
        1. Exporte os dados das nossas coleções MongoDB
        2. Transforme os documentos para corresponder ao esquema do PostgreSQL
           (ObjectId → UUID, achatar documentos aninhados, converter datas)
        3. Importe no PostgreSQL preservando os relacionamentos de chave estrangeira
        4. Verifique a integridade dos dados: contagem de linhas, relacionamentos de chaves, verificações pontuais
        ```
      </PromptBlock>

      Após a importação, execute toda a suíte de testes usando o back-end em Postgres. Verifique se todas as operações CRUD, fluxos de autenticação e o controle de acesso baseado em função (RBAC) estão funcionando corretamente.
    </Step>

    <Step title="Implantar e otimizar">
      Implante usando feature flags para uma implantação gradual. Mantenha a instância do MongoDB como fallback durante a transição.

      Checklist pós-implantação:

      * Adicione índices para colunas consultadas com frequência
      * Use `EXPLAIN ANALYZE` para identificar consultas lentas
      * Configure o pool de conexões (por exemplo, PgBouncer)
      * Monitore o desempenho das consultas e a utilização das conexões
      * Documente procedimentos de rollback para problemas críticos

      <PromptBlock>
        ```txt Otimização pós-migração theme={null}
        A migração de MongoDB para Postgres foi implantada em produção. Execute EXPLAIN ANALYZE
        nas nossas consultas mais frequentes e sugira índices. Verifique:
        1. Scans sequenciais em tabelas grandes que deveriam usar índices
        2. Falta de índices em colunas de chave estrangeira
        3. Consultas que poderiam se beneficiar de índices parciais ou compostos
        4. Recomendações de dimensionamento do pool de conexões com base na nossa carga de trabalho
        ```
      </PromptBlock>

      Quando tudo estiver estável e verificado, descomissione a instância do MongoDB.
    </Step>

    <Step title="Torne isso reproduzível com um playbook">
      Se você precisar executar esse padrão de migração em vários serviços ou repositórios, salve-o como um [playbook](/pt-BR/product-guides/creating-playbooks) para que cada sessão siga o mesmo processo. Abaixo está um exemplo de playbook para uma migração do MongoDB para o Postgres:

      <PromptBlock type="playbook">
        ```txt MongoDB to PostgreSQL Migration theme={null}
        ## Visão Geral
        Migre um projeto do MongoDB para o PostgreSQL. Este guia abrange
        design de schema, migração de API de backend, atualizações da camada
        de serviço do frontend, migração de dados e deploy.

        ## O Que é Necessário do Usuário
        - Acesso ao banco de dados MongoDB de origem (string de conexão ou exportação)
        - Credenciais do banco de dados PostgreSQL de destino
          (host, porta, banco de dados, usuário, senha)
        - Descrição do modelo de dados da aplicação e das principais consultas
        - Requisitos de autenticação/autorização para o novo sistema

        ## Fase 1: Design e Configuração do Schema do Banco de Dados

        ### Etapa 1: Configuração do Projeto
        1. Provisione um banco de dados PostgreSQL e registre as credenciais de conexão
        2. Analise as coleções MongoDB existentes e os schemas dos documentos
        3. Projete as tabelas equivalentes no PostgreSQL com os relacionamentos adequados

        ### Etapa 2: Criação do ERD
        Se o schema MongoDB de origem envolver múltiplas coleções com
        relacionamentos (documentos embutidos, referências via ObjectIds ou
        padrões de junção), crie um Diagrama Entidade-Relacionamento antes
        de projetar as tabelas PostgreSQL:
        1. Identifique todas as entidades e seus atributos a partir das
           coleções MongoDB
        2. Mapeie os relacionamentos entre entidades
           (um-para-um, um-para-muitos, muitos-para-muitos)
        3. Gere um ERD usando uma ferramenta como dbdiagram.io, Mermaid ou
           draw.io
        4. Use o ERD para validar as decisões de normalização e o design de
           chaves estrangeiras antes de escrever qualquer SQL

        Ignore esta etapa se a migração envolver apenas uma única coleção
        ou um pequeno conjunto de coleções independentes sem relacionamentos
        significativos.

        ### Etapa 3: Padrões de Conversão de Schema
        - IDs de Documentos: Converta campos _id do MongoDB para chaves primárias UUID ou SERIAL no PostgreSQL
        - Objetos Aninhados: Desnormalize em tabelas separadas com relacionamentos de chave estrangeira
        - Arrays: Use tipos de array do PostgreSQL ou tabelas de junção separadas
        - Documentos Embutidos: Extraia para tabelas relacionadas com normalização adequada

        ### Etapa 4: Configuração de Segurança
        1. Crie roles e usuários no PostgreSQL com os privilégios adequados
           (somente leitura, leitura e escrita, admin)
        2. Use GRANT/REVOKE para restringir o acesso a tabelas e colunas por role
        3. Se a aplicação precisar de controle de acesso em nível de linha, habilite
           políticas de Row Level Security (RLS) nas tabelas relevantes

        ### Etapa 5: Funções e Triggers do Banco de Dados
        1. Crie triggers de gerenciamento de usuários para criação automática de registros
           (ex.: timestamps de auditoria, valores padrão)
        2. Implemente funções de lógica de negócio em PL/pgSQL para substituir
           validações em nível de aplicação quando apropriado

        ## Fase 2: Migração da API de Backend

        ### Etapa 1: Gerenciamento de Dependências
        1. Substitua os drivers do MongoDB (ex.: mongodb, mongoose) por uma
           biblioteca cliente do PostgreSQL (ex.: pg para Node.js, psycopg2
           para Python, ou um ORM como Prisma/Sequelize/TypeORM)
        2. Atualize a configuração de ambiente com as credenciais de conexão
           do PostgreSQL (DATABASE_URL ou variáveis individuais de host/porta/db/usuário/senha)
        3. Remova ou substitua middlewares e utilitários específicos do MongoDB

        ### Etapa 2: Atualizações do Sistema de Autenticação
        1. Se a aplicação existente usar autenticação JWT personalizada, mantenha-a e atualize
           as consultas de busca de usuário para usar o PostgreSQL
        2. Se estiver migrando para um novo sistema de autenticação, substitua a geração de tokens
           e o middleware de validação conforme necessário
        3. Mantenha os formatos de resposta da API existentes para
           compatibilidade com o frontend

        ### Etapa 3: Padrões de Migração de Consultas
        - Operações de Busca: Converta collection.find() para consultas SQL SELECT
          (ou equivalentes de ORM como .findMany(), .select())
        - Pipelines de Agregação: Substitua por JOINs, GROUP BY,
          subconsultas e funções de janela do PostgreSQL
        - Atualizações: Converta updateOne/updateMany para instruções SQL UPDATE
        - Inserções: Substitua insertOne/insertMany por instruções SQL INSERT
          ou métodos de inserção em lote

        ### Etapa 4: Atualizações no Tratamento de Erros
        1. Substitua os códigos de erro específicos do MongoDB pelo tratamento
           de erros do PostgreSQL (ex.: violações de restrição de unicidade correspondem ao código 23505)
        2. Mantenha formatos de resposta de erro consistentes para os
           serviços do frontend

        ## Fase 3: Atualizações da Camada de Serviço do Frontend

        ### Etapa 1: Migração do Serviço de Autenticação
        1. Atualize o serviço de autenticação de usuários para funcionar com os novos
           endpoints de autenticação do backend
        2. Se a abordagem de autenticação mudou, atualize os fluxos de login/logout e o
           gerenciamento de tokens conforme necessário
        3. Modifique a criação de objetos de usuário para funcionar com o novo formato
           de dados de usuário do PostgreSQL

        ### Etapa 2: Atualizações do Cliente HTTP
        1. Atualize as URLs dos endpoints da API se a estrutura do backend mudar
        2. Ajuste o tratamento de requisições/respostas se os formatos de dados mudaram
           (ex.: _id passando a ser id)
        3. Mantenha as assinaturas dos métodos de serviço existentes para
           compatibilidade com os componentes

        ### Etapa 3: Atualizações de Guards de Rota e Resolvers
        1. Atualize os guards de autenticação para funcionar com o novo sistema de autenticação
        2. Modifique os resolvers de rota se os padrões de busca de dados mudaram
        3. Verifique se os fluxos de dados dos componentes existentes continuam funcionando corretamente

        ## Fase 4: Migração de Dados e Testes

        ### Etapa 1: Exportação e Transformação de Dados
        1. Exporte as coleções MongoDB usando mongoexport ou scripts personalizados
        2. Transforme os dados para atender aos requisitos do schema do PostgreSQL
        3. Trate as conversões de tipos de dados (ObjectId para UUID, datas,
           documentos embutidos para chaves estrangeiras, etc.)

        ### Etapa 2: Processo de Importação de Dados
        1. Importe os dados usando psql \copy, pg_restore ou scripts de migração
           personalizados
        2. Verifique os relacionamentos de chaves estrangeiras e as restrições após a importação
        3. Execute contagens e verificações pontuais para confirmar a integridade e
           a completude dos dados

        ### Etapa 3: Testes End-to-End
        1. Teste todas as operações CRUD com dados reais
        2. Verifique se os fluxos de autenticação funcionam corretamente
        3. Teste as funcionalidades de administração e o controle de acesso baseado em roles

        ## Fase 5: Deploy e Monitoramento

        ### Etapa 1: Estratégia de Deploy
        1. Faça o deploy das alterações do backend com feature flags para rollout gradual
        2. Atualize a configuração do frontend para os endpoints de produção
           com suporte ao PostgreSQL
        3. Implemente connection pooling no banco de dados (ex.: PgBouncer) e
           monitoramento

        ### Etapa 2: Otimização de Desempenho
        1. Adicione índices no banco de dados para colunas consultadas com frequência
        2. Use EXPLAIN ANALYZE para identificar e otimizar consultas lentas
        3. Monitore o desempenho das consultas e a utilização do connection pool

        ### Etapa 3: Planejamento de Rollback
        1. Mantenha a instância do MongoDB como backup durante o período de transição
        2. Documente os procedimentos de rollback para situações críticas
        3. Crie scripts de sincronização de dados se necessário

        ## Principais Padrões de Migração

        ### Migração de Autenticação
        - De: JWT personalizado com armazenamento de usuários no MongoDB
        - Para: JWT personalizado (ou autenticação de framework) com armazenamento de usuários no PostgreSQL
        - Preservar: Interfaces de objetos de usuário existentes e contratos de componentes

        ### Migração de Consultas ao Banco de Dados
        - De: Pipelines de agregação e consultas de documentos do MongoDB
        - Para: Consultas SQL com JOINs, GROUP BY e funções de janela
        - Preservar: Formatos de resposta da API e estruturas de dados

        ### Migração de Segurança
        - De: Autorização em nível de aplicação com MongoDB
        - Para: Roles/privilégios do PostgreSQL mais políticas RLS opcionais
        - Preservar: Lógica de roles e permissões de usuários

        ## Especificações
        - Todos os contratos de API e formatos de resposta existentes devem ser
          preservados
        - A integridade dos dados deve ser verificada após a migração (contagens de linhas,
          relacionamentos de chaves, verificações pontuais)
        - A instância do MongoDB deve permanecer disponível como fallback
          durante o período de transição
        - Validação: Execute o conjunto de testes da aplicação end-to-end contra
          o backend PostgreSQL e confirme que todos os testes passam
        ```
      </PromptBlock>
    </Step>
  </Steps>
</div>
