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