CW 1

🚀 O que é o MongoDB?

MongoDB é um banco de dados NoSQL, ou seja, não usa tabelas e colunas como os bancos tradicionais (SQL). Em vez disso, ele armazena os dados em documentos parecidos com arquivos JSON, que são como objetos do JavaScript.


📌 Exemplo de documento no MongoDB:

{

"nome": "Maria",

"idade": 20,

"curso": "Engenharia"

}


Isso seria como uma “linha” de uma tabela, mas aqui pode ter campos diferentes de outros documentos!


🔠 Tipos de dados no MongoDB

Para saber o tipo de dado de um campo, usamos:

typeof → mostra o tipo (como “string”, “object”, etc.)

instanceof → verifica se algo é uma instância de um tipo específico


📌 Exemplo prático:

typeof "Maria" // retorna "string"

typeof 30 // retorna "number"

mydoc._id instanceof ObjectID // verifica se o campo _id é um ObjectID


🕒 Trabalhando com Datas

MongoDB tem vários jeitos de lidar com datas:


Date() - Retorna a data como texto (string)

new Date() - Retorna um objeto Date (pra fazer cálculos)

ISODate() - Igual ao de cima, mas no padrão ISO


📌 Exemplo:

var hoje = new Date();

console.log(hoje); // ISODate("2025-08-06T12:00:00Z")


🧾 Inserindo Documentos

MongoDB trabalha com documentos dentro de coleções (como se fossem pastas com arquivos).


📥 Inserir 1 documento:

db.alunos.insertOne({

nome: "João",

idade: 18

});


📥 Inserir vários:

db.alunos.insertMany([

{ nome: "Maria", idade: 19 },

{ nome: "Carlos", idade: 20 }

]);


📌 Observação: se você não colocar um campo _id, o MongoDB cria um automático (chamado ObjectID).


🧬 Entendendo o ObjectID

Todo documento tem um campo chamado _id que é único, como um RG digital.

O tipo padrão usado é o ObjectID, que é como uma "assinatura única" para cada documento. Ele é composto por:


Data e hora da criação

ID da máquina

ID do processo

Número aleatório incremental


🛠 Métodos úteis com ObjectID:

ObjectID().getTimestamp() - Pega a data de criação do ID

ObjectID().toString() - Mostra como string ex: "ObjectID(abc123...)"

ObjectID().valueOf() - Retorna só a parte hexadecimal: "abc123..."


🔁 Operações CRUD no MongoDB

CRUD é uma sigla que representa as quatro operações básicas de um banco de dados:


C Create - Criar um novo documento

R Read - Ler/buscar um documento

U Update - Atualizar dados existentes

D Delete - Apagar um ou mais documentos



📌 Exemplos práticos:

Criar (Create):

db.alunos.insertOne({ nome: "Duda", curso: "Web" });

Ler (Read):

db.alunos.find(); // mostra todos

db.alunos.findOne({ nome: "Duda" }); // mostra o primeiro que encontrar

Atualizar (Update):

db.alunos.updateOne({ nome: "Duda" }, { $set: { curso: "Fullstack" } });

Excluir (Delete):

db.alunos.deleteOne({ nome: "Duda" });


🐍 Usando Python com MongoDB (PyMongo)

Se você quiser usar Python para mexer com o MongoDB, existe uma biblioteca chamada PyMongo.


📌 Exemplo básico:

import pymongo

cliente = pymongo.MongoClient("mongodb://localhost:27017/")

db = cliente["escola"]

colecao = db["alunos"]


Você pode usar o PyMongo para inserir, buscar e atualizar dados, igual ao que fazemos no shell do MongoDB.


🧱 Modelagem de Dados no MongoDB

Modelar os dados significa organizar a forma como eles são guardados no banco, de um jeito que seja rápido de acessar e fácil de manter.

💡 No MongoDB, como ele é flexível, você não precisa definir o formato antes de inserir os dados. Cada documento pode ter campos diferentes. Isso é ótimo, mas exige cuidado!


🔁 Relações entre Documentos

Mesmo sem tabelas, os dados podem estar relacionados entre si, como no mundo real.


📌 Tipos de relacionamento:


Tipo

Um para Um (1:1) - Um documento está ligado a outro, apenas um. (Aluno e RG)

Um para Muitos - Um documento tem vários ligados a ele. (Filme e Vários Comentários)

Muitos para Muitos - Vários documentos ligados a vários outros. (Alunos e Cursos)


🔗 Relacionamentos: Referenciados vs Incorporados


🔸 Referenciado

Os dados ficam em documentos separados, mas ligados por um ID.

Semelhante ao modelo relacional (como no SQL).

Ideal quando você acessa os dados separadamente.


📌 Exemplo:

// Documento do artigo

{

"_id": 1,

"titulo": "Aprendendo MongoDB"

}


// Documento do comentário

{

"artigo_id": 1,

"texto": "Muito bom!"

}


🔹 Incorporado

Os dados estão todos juntos em um único documento.

Evita buscas adicionais.

Ótimo para dados que sempre são acessados juntos.


📌 Exemplo:

{

"titulo": "Aprendendo MongoDB",

"comentarios": [

{ "texto": "Muito bom!" },

{ "texto": "Gostei bastante!" }

]

}


🧩 Exemplos de Relacionamento


📍 1:1 (Um para Um)

Imagine um aluno com um crachá de identificação. Só ele tem aquele crachá, e só pode ter um.


📌 Exemplo incorporado:

{

"nome": "João",

"id_aluno": {

"codigo": "A123456"

}

}


📍 1:N (Um para Muitos)

Um filme com várias avaliações.


📌 Exemplo:

{

"titulo": "Inception",

"avaliacoes": [

{ "usuario": "Maria", "nota": 10 },

{ "usuario": "Lucas", "nota": 9 }

]

}


👉 Quando tiver milhares de registros (como logs ou comentários), pode ser melhor referenciar, para não deixar o documento muito pesado.


📍 N:N (Muitos para Muitos)

Um aluno pode estar em vários cursos, e um curso pode ter vários alunos.


📌 Exemplo:

{

"nome": "Carla",

"cursos": ["Engenharia", "Design"]

}


E do outro lado:

{

"nome_curso": "Engenharia",

"alunos": ["Carla", "João"]

}


Esse tipo de modelagem geralmente usa arrays para guardar várias ligações.


🧠 Dica de ouro na modelagem

Se os dados são acessados juntos, incorpore.

Se os dados são acessados separadamente ou crescem muito, referencie.