Pular para conteúdo

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:

  1. Schema flexível: Armazenar documentos sem estrutura rígida predefinida
  2. Escalabilidade horizontal: Distribuir dados em múltiplos servers facilmente
  3. Performance em leitura: Consultas rápidas em grandes volumes de dados
  4. Documentos aninhados: Armazenar objetos complexos nativamente
  5. Agregações poderosas: Processar e transformar dados no database

Como funciona internamente?

Quando o MONGODB é executado, o sistema:

  1. Identifica operação: insert_one, insert_many, find, find_one, update_one, update_many, delete_one, delete_many
  2. Valida parâmetros: Collection, document/query conforme operação
  3. Executa operação: Simula operação MongoDB (produção requer mongodb driver)
  4. Retorna resultado: IDs inseridos, documentos encontrados, ou counts de modificados/deletados
  5. 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

  1. Catálogo de produtos: Schema flexível para atributos variados
  2. Logs de aplicação: Estrutura variável de logs
  3. Perfis de usuário: Campos customizados por usuário
  4. Dados de sessão: Armazenar estados temporários
  5. 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