MONGODB - NoSQL Database Operations
O que é este Node?
O MONGODB é o node responsável por integrar com MongoDB para inserir, buscar, atualizar e deletar documentos em coleções NoSQL.
Por que este Node existe?
Aplicações modernas precisam armazenar dados não-relacionais de forma flexível. O MONGODB existe para:
- Schema flexível: Armazenar documentos sem estrutura rígida predefinida
- Escalabilidade horizontal: Distribuir dados em múltiplos servers facilmente
- Performance em leitura: Consultas rápidas em grandes volumes de dados
- Documentos aninhados: Armazenar objetos complexos nativamente
- Agregações poderosas: Processar e transformar dados no database
Como funciona internamente?
Quando o MONGODB é executado, o sistema:
- Identifica operação: insert_one, insert_many, find, find_one, update_one, update_many, delete_one, delete_many
- Valida parâmetros: Collection, document/query conforme operação
- Executa operação: Simula operação MongoDB (produção requer mongodb driver)
- Retorna resultado: IDs inseridos, documentos encontrados, ou counts de modificados/deletados
- Se erro: Lança exceção com detalhes
Código interno (infrastructure-executor.service.ts:174-207):
private async executeMongoDB(parameters: any, context: any): Promise<any> {
const { operation, collection, document, query, connectionString, database } = parameters;
this.logger.log(`🍃 MONGODB - Operation: ${operation}, Collection: ${collection}`);
switch (operation) {
case 'insert_one':
return this.insertMongoDocument(collection, document, connectionString, database, context);
case 'insert_many':
return this.insertManyMongoDocuments(collection, parameters.documents, connectionString, database, context);
case 'find':
return this.findMongoDocuments(collection, query, connectionString, database, context);
case 'find_one':
return this.findOneMongoDocument(collection, query, connectionString, database, context);
case 'update_one':
return this.updateMongoDocument(collection, query, parameters.update, connectionString, database, context);
case 'update_many':
return this.updateManyMongoDocuments(collection, query, parameters.update, connectionString, database, context);
case 'delete_one':
return this.deleteMongoDocument(collection, query, connectionString, database, context);
case 'delete_many':
return this.deleteManyMongoDocuments(collection, query, connectionString, database, context);
default:
throw new Error(`Unsupported MongoDB operation: ${operation}`);
}
}
Quando você DEVE usar este Node?
Use MONGODB quando precisar armazenar dados não-relacionais:
Casos de uso
- Catálogo de produtos: Schema flexível para atributos variados
- Logs de aplicação: Estrutura variável de logs
- Perfis de usuário: Campos customizados por usuário
- Dados de sessão: Armazenar estados temporários
- Content management: Artigos, posts com estrutura dinâmica
Quando NÃO usar MONGODB
- Transações complexas: Use PostgreSQL/MySQL para ACID garantido
- Relacionamentos fortes: Use SQL para dados altamente relacionados
- Joins complexos: SQL databases são melhores
- Dados tabulares simples: SQL é mais eficiente
Parâmetros Detalhados
operation (string, obrigatório)
O que é: Tipo de operação a ser executada no MongoDB.
Valores válidos:
- insert_one: Inserir documento único
- insert_many: Inserir múltiplos documentos
- find: Buscar múltiplos documentos
- find_one: Buscar um documento
- update_one: Atualizar um documento
- update_many: Atualizar múltiplos documentos
- delete_one: Deletar um documento
- delete_many: Deletar múltiplos documentos
Flow completo para testar:
{
"name": "Teste MONGO - Insert One",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongo_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Inserir Usuário",
"parameters": {
"operation": "insert_one",
"collection": "users",
"document": {
"name": "João Silva",
"email": "joao@example.com",
"age": 30
},
"database": "myapp",
"connectionString": "mongodb://localhost:27017"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Usuário inserido! ID: {{mongo_1.insertedId}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongo_1" },
{ "source": "mongo_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Documento é inserido no MongoDB.
collection (string, obrigatório)
O que é: Nome da coleção MongoDB (equivalente a tabela em SQL).
Flow completo para testar:
{
"name": "Teste MONGO - Collection",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongo_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Inserir Produto",
"parameters": {
"operation": "insert_one",
"collection": "products",
"document": {
"name": "Notebook",
"price": 3500,
"inStock": true
},
"database": "ecommerce",
"connectionString": "mongodb://localhost:27017"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Produto salvo na coleção 'products'!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongo_1" },
{ "source": "mongo_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Documento é inserido na coleção especificada.
document (object, obrigatório para insert/update)
O que é: Objeto com dados do documento a ser inserido.
Flow completo para testar:
{
"name": "Teste MONGO - Document",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Pedir Nome",
"parameters": {
"message": "Seu nome:",
"variable": "nome"
}
}
},
{
"id": "email_1",
"type": "email",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Pedir Email",
"parameters": {
"message": "Seu email:",
"variable": "email"
}
}
},
{
"id": "mongo_1",
"type": "mongodb",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Salvar Usuário",
"parameters": {
"operation": "insert_one",
"collection": "users",
"document": {
"name": "{{nome}}",
"email": "{{email}}",
"createdAt": "{{now}}",
"status": "active",
"preferences": {
"notifications": true,
"theme": "light"
}
},
"database": "myapp",
"connectionString": "mongodb://localhost:27017"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Cadastro salvo, {{nome}}!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "email_1" },
{ "source": "email_1", "target": "mongo_1" },
{ "source": "mongo_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Documento com variáveis e objetos aninhados é inserido.
query (object, obrigatório para find/update/delete)
O que é: Filtro para selecionar documentos (MongoDB query).
Flow completo para testar:
{
"name": "Teste MONGO - Query",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Buscar Email",
"parameters": {
"message": "Email para buscar:",
"variable": "email"
}
}
},
{
"id": "mongo_1",
"type": "mongodb",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Buscar Usuário",
"parameters": {
"operation": "find_one",
"collection": "users",
"query": {
"email": "{{email}}"
},
"database": "myapp",
"connectionString": "mongodb://localhost:27017"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Resultado",
"parameters": {
"message": "Usuário encontrado: {{mongo_1.document.name}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "mongo_1" },
{ "source": "mongo_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Documento é encontrado pelo filtro.
update (object, obrigatório para update_*)
O que é: Operações de atualização MongoDB ($set, $inc, etc).
Flow completo para testar:
{
"name": "Teste MONGO - Update",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Email",
"parameters": {
"message": "Email do usuário:",
"variable": "email"
}
}
},
{
"id": "mongo_1",
"type": "mongodb",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Atualizar Status",
"parameters": {
"operation": "update_one",
"collection": "users",
"query": {
"email": "{{email}}"
},
"update": {
"$set": {
"status": "premium",
"updatedAt": "{{now}}"
},
"$inc": {
"loginCount": 1
}
},
"database": "myapp",
"connectionString": "mongodb://localhost:27017"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Usuário atualizado para premium!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "mongo_1" },
{ "source": "mongo_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Documento é atualizado com $set e $inc.
documents (array, obrigatório para insert_many)
O que é: Array de documentos para inserção em lote.
database (string, opcional)
O que é: Nome do database MongoDB (padrão: 'default').
connectionString (string, opcional)
O que é: Connection string do MongoDB (padrão: 'mongodb://localhost:27017').
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | insert_one, insert_many, find, find_one, update_one, update_many, delete_one, delete_many |
| collection | string | Sim | Nome da coleção |
| document | object | Sim* | Documento a inserir (*para insert_one) |
| documents | array | Sim* | Documentos a inserir (*para insert_many) |
| query | object | Sim* | Filtro de busca (*para find/update/delete) |
| update | object | Sim* | Operações de update (para update_) |
| database | string | Não | Nome do database (padrão: default) |
| connectionString | string | Não | Connection string (padrão: mongodb://localhost:27017) |
Exemplo 1: Cadastro Completo
Objetivo: Inserir e buscar perfil de usuário
JSON para Importar
{
"name": "MONGO - Cadastro Usuário",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Pedir Nome",
"parameters": {
"message": "Qual seu nome completo?",
"variable": "nome"
}
}
},
{
"id": "email_1",
"type": "email",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Pedir Email",
"parameters": {
"message": "Seu email:",
"variable": "email"
}
}
},
{
"id": "number_1",
"type": "number",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Pedir Idade",
"parameters": {
"message": "Sua idade:",
"variable": "idade"
}
}
},
{
"id": "mongo_1",
"type": "mongodb",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Salvar Perfil",
"parameters": {
"operation": "insert_one",
"collection": "user_profiles",
"document": {
"name": "{{nome}}",
"email": "{{email}}",
"age": "{{idade}}",
"createdAt": "{{now}}",
"status": "active",
"profile": {
"bio": "",
"avatar": null,
"preferences": {
"language": "pt-BR",
"notifications": true
}
}
},
"database": "social_network",
"connectionString": "mongodb://localhost:27017"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Boas-vindas",
"parameters": {
"message": "Bem-vindo, {{nome}}! Seu perfil foi criado com sucesso."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1300, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "email_1" },
{ "source": "email_1", "target": "number_1" },
{ "source": "number_1", "target": "mongo_1" },
{ "source": "mongo_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: Qual seu nome completo?
Usuário: Maria Santos
Sistema: Seu email:
Usuário: maria@example.com
Sistema: Sua idade:
Usuário: 28
Sistema: Bem-vindo, Maria Santos! Seu perfil foi criado com sucesso.
Exemplo 2: Inserção em Lote
Objetivo: Inserir múltiplos produtos de uma vez
JSON para Importar
{
"name": "MONGO - Insert Many",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongo_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Inserir Produtos",
"parameters": {
"operation": "insert_many",
"collection": "products",
"documents": [
{
"name": "Notebook Dell",
"price": 3500,
"category": "electronics",
"inStock": true
},
{
"name": "Mouse Logitech",
"price": 80,
"category": "electronics",
"inStock": true
},
{
"name": "Teclado Mecânico",
"price": 350,
"category": "electronics",
"inStock": false
}
],
"database": "ecommerce",
"connectionString": "mongodb://localhost:27017"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "{{mongo_1.insertedCount}} produtos inseridos!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongo_1" },
{ "source": "mongo_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: 3 produtos inseridos!
Exemplo 3: Busca e Atualização
Objetivo: Buscar usuários e atualizar status
JSON para Importar
{
"name": "MONGO - Find and Update",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongo_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Buscar Inativos",
"parameters": {
"operation": "find",
"collection": "users",
"query": {
"status": "inactive"
},
"database": "myapp",
"connectionString": "mongodb://localhost:27017"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Mostrar Count",
"parameters": {
"message": "Encontrados {{mongo_1.count}} usuários inativos"
}
}
},
{
"id": "mongo_2",
"type": "mongodb",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Ativar Todos",
"parameters": {
"operation": "update_many",
"collection": "users",
"query": {
"status": "inactive"
},
"update": {
"$set": {
"status": "active",
"reactivatedAt": "{{now}}"
}
},
"database": "myapp",
"connectionString": "mongodb://localhost:27017"
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "{{mongo_2.modifiedCount}} usuários reativados!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongo_1" },
{ "source": "mongo_1", "target": "message_1" },
{ "source": "message_1", "target": "mongo_2" },
{ "source": "mongo_2", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: Encontrados 5 usuários inativos
Sistema: 5 usuários reativados!
Resposta do Node
Insert One
{
"success": true,
"action": "mongodb_document_inserted",
"collection": "users",
"database": "myapp",
"insertedId": "abc123xyz456",
"document": { "name": "João", "email": "joao@example.com" },
"timestamp": "2025-01-15T10:30:00.000Z"
}
Find
{
"success": true,
"action": "mongodb_documents_found",
"collection": "users",
"database": "myapp",
"query": { "status": "active" },
"documents": [],
"count": 0,
"timestamp": "2025-01-15T10:30:00.000Z"
}
Update Many
{
"success": true,
"action": "mongodb_documents_updated",
"collection": "users",
"database": "myapp",
"matchedCount": 5,
"modifiedCount": 5,
"timestamp": "2025-01-15T10:30:00.000Z"
}
Operadores MongoDB
Query Operators
$eq: Igual$ne: Diferente$gt: Maior que$gte: Maior ou igual$lt: Menor que$lte: Menor ou igual$in: Em array$nin: Não em array
Update Operators
$set: Define valor$unset: Remove campo$inc: Incrementa número$push: Adiciona em array$pull: Remove de array$addToSet: Adiciona único em array
Boas Práticas
✅ SIM:
- Use índices para queries frequentes
- Normalize dados moderadamente (não totalmente)
- Use ObjectId para _id (padrão)
- Valide dados antes de inserir
- Implemente paginação em queries grandes
❌ NÃO:
- Não armazene dados gigantes em documentos (limite 16MB)
- Não faça joins complexos (design schema diferente)
- Não ignore índices (performance)
- Não use MongoDB como cache (use Redis)
- Não delete sem query específica
Dicas
💡 Produção: Esta implementação é simulada. Em produção, instale mongodb driver no projeto
💡 Índices: Crie índices em campos usados em queries: { email: 1 }
💡 Schema: Mesmo sem schema obrigatório, mantenha consistência
💡 Aggregation: Use aggregation pipeline para transformações complexas
Próximo Node
→ POSTGRES - SQL database relacional → ELASTICSEARCH - Busca e analytics → REDIS - Cache e estruturas de dados