Fundamentos de Modelagem de Dados no MongoDB

Terminoloiga: SQL versus MongoDB

Conceito Relacional Equivalente no MongoDB Significado
Banco de dados database Repositório lógico de dados
Tabela collection Agrupamento de registros
Linha document Registro individual
Coluna field Atributo de um documento
Índice index Estrutura para acelerar consultas
JOIN documento embutido Relacionamento via aninhamento
Chave primária _id Identificador único gerado automaticamente

Bancos de Dados

Uma instância do MongoDB pode hospedar vários bancos independentes, cada um com suas próprias coleções, usuários e permissões. Os arquivos físicos residem no diretório de dados configurado.

Ao iniciar o shell, o contexto padrão costuma ser o banco test. Para listar os repositórios existentes, utilize:

> show dbs
admin   0.000GB
local   0.078GB
loja    0.156GB

Para verificar qual banco está selecionado:

> db
test

Para alternar entre bancos:

> use loja
switched to db loja
> db
loja

Regras para nomes de banco de dados:

  • Não podem ser strings vazias.
  • Não devem conter espaços, pontos, cifrão, barras ou o caractere nulo.
  • Recomenda-se o uso de letras minúsculas.
  • Limite de 64 bytes.

Alguns bancos possuem funções reservadas:

  • admin: administração global, usuários privilegiados e comandos especiais.
  • local: dados que não são replicados entre nós do cluster.
  • config: metadados relacionados ao particionamento (sharding).

Documentos

A unidade básica de armazenamento no MongoDB é o documento BSON, formado por pares de chave e valor. Documentos de uma mesma coleção podem ter campos diferentes e tipos distintos para um mesmo campo.

Exemplo:

{
  "dominio": "exemplo.com.br",
  "titulo": "Portal Exemplo",
  "acessos": 1250
}

Características fundamentais:

  • Os pares chave/valor preservam a ordem de inserção.
  • Um valor pode ser escalar, array ou outro documento embutido.
  • O sistema diferencia maiúsculas de minúsculas e tipos de dados.
  • Chaves duplicadas não são permitidas no mesmo documento.
  • As chaves são strings UTF-8, sujeitas a poucas restrições.

Restrições de nomenclatura para campos:

  • Não podem conter o caractere nulo (\0).
  • Os símbolos . e $ possuem significados especiais.
  • Campos iniciados com _ são reservados para uso interno.

Coleções

Coleções agrupam documentos sem impor um esquema rígido. Isso permite inserir estruturas variadas, desde que semanticamente relacionadas.

{ "dominio": "busca.com.br" }
{ "dominio": "email.com.br", "servico": "Webmail" }
{ "dominio": "loja.com.br", "servico": "E-commerce", "ativo": true }

Uma coleção é criada implicitamente no momento em que o primeiro documento é inserido.

Regras para nomes de coleção:

  • Não podem ser strings vazias.
  • Não podem conter o caractere nulo.
  • Não podem começar com system..
  • Evite o caractere $ em nomes criados manualmente.

Coleções Limitadas (Capped Collections)

Coleções limitadas possuem tamanho máximo fixo e comportam-se como uma fila circular: quando o espaço se esgota, os documentos mais antigos são removidos. Esse modelo é ideal para logs e fluxos de eventos.

Criação de uma coleção limitada:

db.createCollection("logs_eventos", {
  capped: true,
  size: 104857600,
  max: 50000
})

Comportamento esperado:

  • Inserções preservam a ordem cronológica.
  • Atualizações não podem aumentar o tamanho do documento.
  • Documentos individuais não podem ser apagados; apenas a coleção inteira via drop().
  • Após a remoção, a coleção deve ser recriada explicitamente.
  • Em arquiteturas de 32 bits, o tamanho máximo é aproximadamente 1 GB.

Metadados do Sistema

Informações internas do MongoDB ficam em coleções especiais dentro do namespace nome_db.system.*:

Namespace Finalidade
dbname.system.namespaces Lista todos os namespaces.
dbname.system.indexes Lista os índices existentes.
dbname.system.profile Dados de profiling e diagnóstico.
dbname.system.users Usuários e credenciais de acesso.
dbname.local.sources Informações de replicação.

Exceto pela criação de índices através de system.indexes, essas coleções não devem ser manipuladas diretamente.

Tipos de Dados

Tipo Descrição
String Texto codificado em UTF-8.
Integer Valor numérico inteiro, 32 ou 64 bits.
Double Número de ponto flutuante de precisão dupla.
Boolean Verdadeiro ou falso.
Date Data/hora em milissegundos desde a época Unix.
Timestamp Tipo interno de 64 bits para controle de operações.
Array Lista de valores sob uma única chave.
Object Documento embutido.
ObjectId Identiifcador único de 12 bytes.
Binary Data Dados binários brutos.
Null Valor nulo.
Regular Expression Padrão de expressão regular.
Code Código JavaScript armazenado no documento.

ObjectId

Cada documento deve conter uma chave _id. Caso não seja fornecida, o MongoDB gera um ObjectId automaticamente. Seus 12 bytes são organizados da seguinte forma:

  • 4 bytes: timestamp Unix da criação.
  • 3 bytes: identificador da máquina.
  • 2 bytes: identificador do processo.
  • 3 bytes: contador incremental aleatório.
> const identificador = new ObjectId()
> identificador.getTimestamp()
ISODate("2023-08-15T14:22:10Z")

> identificador.valueOf()
64db3e72a1b2c3d4e5f60718

Strings, Datas e Timestamps

Todas as strings BSON utilizam codificação UTF-8. O tipo Date representa o momento em milissegundos desde 1º de janeiro de 1970. O tipo Timestamp, por sua vez, é empregado principalmente em mecanismos internos como o oplog de replicação.

> const agora = new Date()
> agora
ISODate("2023-08-15T10:30:00.000Z")
> typeof agora
object

> const representacao = agora.toString()
> representacao
Tue Aug 15 2023 10:30:00 GMT+0000 (UTC)
> typeof representacao
string

Tags: mongodb BSON nosql ObjectId Capped Collections

Publicado em 6-21 01:52