MongoDB3 min de leitura

Índices e Design de Schema no MongoDB

MongoDB além do índice: o impacto real do schema na escalabilidade

Indices

Existe uma crença comum em projetos com MongoDB:

"Se eu criar bons índices, está tudo resolvido."

Na prática, isso não se sustenta em ambiente de produção.

Você pode ter índices bem definidos e ainda assim enfrentar degradação de performance, queries inconsistentes e dificuldade de escalar horizontalmente.

O problema quase sempre está em um ponto negligenciado: design do schema.


Schema no MongoDB não é opcional

MongoDB é schema-flexível — não schema-less.

Isso significa que:

  • O banco não exige um schema
  • Mas a aplicação deve definir e respeitar um contrato

Quando esse contrato não existe ou é inconsistente, você começa a pagar o preço em runtime.


O erro silencioso: tipos errados

Um dos problemas mais comuns (e mais subestimados) é o uso incorreto de tipos.

Exemplo clássico: datas como string

{
  "createdAt": "2026-05-01"
}

Parece inofensivo, mas cria uma série de problemas:

  • Comparações deixam de ser numéricas/temporais e passam a ser lexicográficas
  • Ordenações podem gerar resultados incorretos dependendo do formato
  • Índices não são aproveitados da forma mais eficiente
  • Queries com range ($gt, $lt) perdem performance

Agora compare com o modelo correto:

{
  "createdAt": ISODate("2026-05-01T00:00:00Z")
}

Aqui o Mongo consegue:

  • Utilizar índices corretamente
  • Executar comparações otimizadas
  • Garantir ordenação consistente

O problema se repete em outros tipos

Esse anti-pattern não acontece só com datas.

Números como string

{
  "price": "100"
}

Impactos:

  • Ordenação incorreta ("100" < "20")
  • Operações matemáticas inviáveis
  • Índices menos eficientes

Boolean como string

{
  "active": "true"
}

Impactos:

  • Queries mais complexas
  • Risco de inconsistência ("true", "TRUE", "1")
  • Perda de padronização

Campos inconsistentes entre documentos

{ "status": "ACTIVE" }
{ "status": true }
{ "status": 1 }

Impactos:

  • Queries precisam tratar múltiplos formatos
  • Índices perdem seletividade
  • Código da aplicação fica mais complexo e propenso a erro

Por que isso impacta tanto a escala?

O MongoDB depende fortemente de:

  • Índices eficientes
  • Predicados consistentes
  • Uso correto de tipos BSON

Quando você quebra isso:

1. O índice deixa de ser eficiente

O Mongo pode até usar o índice, mas com menor seletividade, aumentando:

  • Scan de documentos
  • Uso de memória
  • Tempo de resposta

2. O query planner perde otimização

O otimizador precisa tomar decisões com base em tipos consistentes.

Quando há inconsistência:

  • Ele escolhe planos subótimos
  • Pode ignorar índices
  • Pode cair em collection scan

3. A aplicação vira responsável por corrigir dados

Você começa a ver código assim:

if (value instanceof String) {
  // converte
}

Isso é um sinal claro de que o problema está no schema — não na lógica.


Índice não corrige modelagem ruim

Um ponto crítico:

Índice acelera acesso. Não corrige semântica.

Se o dado está mal modelado:

  • O índice só mascara o problema (temporariamente)
  • O custo aparece quando o volume cresce

Boas práticas para evitar esse cenário

1. Defina um contrato explícito

Mesmo usando MongoDB, trate o schema como obrigatório:

  • Use validação ($jsonSchema)
  • Documente os tipos
  • Padronize desde o primeiro documento

2. Use os tipos corretos do BSON

  • Datas → Date
  • Números → int, long, decimal
  • Boolean → true / false

3. Garanta consistência na escrita

A inconsistência geralmente nasce na aplicação:

  • Múltiplos serviços escrevendo no mesmo collection
  • Falta de validação na API
  • Integrações externas sem contrato

4. Pense no acesso antes de modelar

Pergunta chave:

Como esse dado será consultado?

Isso define:

  • Tipo
  • Estrutura
  • Índices

5. Evite "flexibilidade prematura"

Flexibilidade sem controle vira:

  • Dívida técnica
  • Custo operacional
  • Refatorações caras

O custo real de ignorar isso

No início, tudo funciona.

Com escala, aparecem:

  • Queries lentas
  • Alto uso de CPU
  • Índices gigantes e ineficientes
  • Migrações complexas
  • Necessidade de reprocessamento
  • Downtime

Conclusão

No MongoDB, o schema não é imposto — mas é decisivo.

Pequenas decisões como escolher o tipo correto de um campo têm impacto direto em:

  • Performance
  • Escalabilidade
  • Custo
  • Complexidade do sistema

Índices ajudam. Mas é o schema que define o jogo.

Se você quer escalar de verdade, comece pelo lugar certo: o primeiro documento que você salva.

Publicado por: Guilherme Gomes - 02/05/2026 21:06

← Voltar aos Artigos