MONGODB FIND - Buscar Documentos no MongoDB
O que é este Node?
O MONGODB FIND é o node responsável por buscar múltiplos documentos em uma coleção MongoDB com suporte a filtros, ordenação, paginação e limites.
Por que este Node existe?
Ao trabalhar com bancos de dados NoSQL como MongoDB, você precisa buscar múltiplos registros que atendam a critérios específicos. O MONGODB FIND existe para:
- Buscar múltiplos documentos: Recuperar vários registros de uma vez
- Filtrar dados: Aplicar queries complexas para buscar documentos específicos
- Paginar resultados: Controlar quantidade de registros retornados (limit/skip)
- Ordenar resultados: Organizar documentos retornados por campos específicos
Como funciona internamente?
Quando o MONGODB FIND é executado, o sistema:
- Valida configuração: Verifica se as credenciais MongoDB foram fornecidas
- Estabelece conexão: Conecta ao servidor MongoDB usando as credenciais
- Seleciona coleção: Acessa a coleção especificada no banco de dados
- Processa query: Substitui variáveis e converte _id strings para ObjectId
- Aplica filtros: Executa a query com limit, skip e sort se especificados
- Retorna documentos: Busca todos os documentos que atendem aos critérios
- Armazena resultado: Salva documentos e contagem na variável especificada
- Fecha conexão: Encerra a conexão com MongoDB
Código interno (mongodb.executor.ts:109-140):
private async find(
db: Db,
collectionName: string,
query: any,
options: any,
context: ExecutionContext,
): Promise<any> {
const replacedQuery = this.replaceObjectVariables(query || {}, context.variables);
const parsedQuery = this.parseMongoQuery(replacedQuery);
const collection = db.collection(collectionName);
let cursor = collection.find(parsedQuery);
if (options.limit) {
cursor = cursor.limit(parseInt(options.limit));
}
if (options.skip) {
cursor = cursor.skip(parseInt(options.skip));
}
if (options.sort) {
cursor = cursor.sort(options.sort);
}
const documents = await cursor.toArray();
return {
documents,
count: documents.length,
};
}
Quando você DEVE usar este Node?
Use MONGODB FIND sempre que precisar buscar múltiplos documentos de uma coleção MongoDB:
Casos de uso
- Listar produtos: "Buscar todos os produtos com estoque > 0"
- Buscar histórico: "Recuperar últimas 10 compras de um cliente"
- Relatórios: "Buscar todas as vendas do mês atual"
- Filtros complexos: "Buscar usuários ativos criados nos últimos 7 dias"
Quando NÃO usar MONGODB FIND
- Buscar único documento: Use MONGODB FIND_ONE para melhor performance
- Modificar ao buscar: Use MONGODB FIND_ONE_AND_UPDATE para atualizar
- Agregações complexas: Use MONGODB AGGREGATE para pipelines
Parâmetros Detalhados
operation (string, obrigatório)
O que é: Define qual operação MongoDB será executada. Para buscar múltiplos documentos, use "find".
Padrão: Nenhum (obrigatório)
Flow completo para testar:
{
"name": "Teste MongoDB Find - Operation",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Buscar Produtos",
"operation": "find",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "loja"
},
"collection": "produtos",
"query": {},
"responseVariable": "produtos"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Mostrar Resultado",
"parameters": {
"message": "Encontrados {{produtos.count}} produtos"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: 1. Execute o flow 2. Espere: "Encontrados X produtos" onde X é o número de documentos na coleção
config (object, obrigatório)
O que é: Objeto contendo as credenciais e configurações de conexão com o MongoDB.
Estrutura:
- connectionString (string): String de conexão completa MongoDB
- OU host, port, user, password: Configuração individual
- database (string, obrigatório): Nome do banco de dados
Flow completo para testar:
{
"name": "Teste MongoDB Find - Config",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Buscar com Config Completo",
"operation": "find",
"config": {
"host": "localhost",
"port": 27017,
"database": "loja",
"user": "admin",
"password": "senha123"
},
"collection": "clientes",
"query": {},
"responseVariable": "clientes"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar Conexão",
"parameters": {
"message": "Conectado! {{clientes.count}} clientes encontrados"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: 1. Configure seu MongoDB local ou remoto 2. Execute o flow 3. Espere: "Conectado! X clientes encontrados"
collection (string, obrigatório)
O que é: Nome da coleção MongoDB onde a busca será realizada.
Flow completo para testar:
{
"name": "Teste MongoDB Find - Collection",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Buscar na Coleção",
"operation": "find",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "ecommerce"
},
"collection": "orders",
"query": {},
"responseVariable": "pedidos"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Mostrar Pedidos",
"parameters": {
"message": "Total de pedidos: {{pedidos.count}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: 1. Certifique-se que a coleção "orders" existe 2. Execute o flow 3. Espere: "Total de pedidos: X"
query (object, opcional)
O que é: Objeto de query MongoDB para filtrar documentos. Suporta todos os operadores MongoDB ($eq, $gt, $lt, $in, etc).
Padrão: {} (busca todos os documentos)
Flow completo para testar:
{
"name": "Teste MongoDB Find - Query",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Buscar Produtos Ativos",
"operation": "find",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "loja"
},
"collection": "produtos",
"query": {
"status": "ativo",
"preco": { "$gte": 100 }
},
"responseVariable": "produtosAtivos"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Mostrar Filtrados",
"parameters": {
"message": "Produtos ativos acima de R$100: {{produtosAtivos.count}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: 1. Popule a coleção "produtos" com alguns documentos 2. Execute o flow 3. Espere: "Produtos ativos acima de R$100: X"
limit (number, opcional)
O que é: Número máximo de documentos a serem retornados.
Padrão: Sem limite (retorna todos)
Flow completo para testar:
{
"name": "Teste MongoDB Find - Limit",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Buscar Top 5",
"operation": "find",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "loja"
},
"collection": "produtos",
"query": {},
"limit": 5,
"responseVariable": "top5"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Mostrar Limitado",
"parameters": {
"message": "Top 5 produtos: {{top5.count}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: 1. Execute o flow 2. Espere: "Top 5 produtos: 5" (ou menos se não houver 5 documentos)
skip (number, opcional)
O que é: Número de documentos a pular antes de começar a retornar resultados (útil para paginação).
Padrão: 0 (não pula nenhum)
Flow completo para testar:
{
"name": "Teste MongoDB Find - Skip",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Segunda Página",
"operation": "find",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "loja"
},
"collection": "produtos",
"query": {},
"limit": 10,
"skip": 10,
"responseVariable": "pagina2"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Mostrar Página 2",
"parameters": {
"message": "Página 2: {{pagina2.count}} produtos"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: 1. Execute o flow 2. Espere: "Página 2: X produtos" (produtos 11-20)
sort (object, opcional)
O que é: Objeto definindo campos e direção de ordenação (1 = ascendente, -1 = descendente).
Padrão: Sem ordenação
Flow completo para testar:
{
"name": "Teste MongoDB Find - Sort",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Ordenar por Preço",
"operation": "find",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "loja"
},
"collection": "produtos",
"query": {},
"sort": { "preco": -1, "nome": 1 },
"limit": 5,
"responseVariable": "maisCaros"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Mostrar Ordenados",
"parameters": {
"message": "5 produtos mais caros encontrados"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: 1. Execute o flow 2. Espere: "5 produtos mais caros encontrados"
responseVariable (string, opcional)
O que é: Nome da variável onde o resultado da busca será armazenado.
Padrão: Se não especificado, resultado não é armazenado
Flow completo para testar:
{
"name": "Teste MongoDB Find - Response Variable",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Buscar e Salvar",
"operation": "find",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "loja"
},
"collection": "produtos",
"query": {},
"responseVariable": "todosProdutos"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Usar Variável",
"parameters": {
"message": "Variável 'todosProdutos' contém {{todosProdutos.count}} documentos"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: 1. Execute o flow 2. Espere: "Variável 'todosProdutos' contém X documentos"
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Tipo de operação MongoDB ("find") |
| config | object | Sim | Configuração de conexão MongoDB |
| collection | string | Sim | Nome da coleção |
| query | object | Não | Filtro de busca (padrão: {}) |
| limit | number | Não | Máximo de documentos a retornar |
| skip | number | Não | Documentos a pular (padrão: 0) |
| sort | object | Não | Ordenação dos resultados |
| responseVariable | string | Não | Variável para armazenar resultado |
Exemplo 1: Buscar Produtos em Estoque
Objetivo: Buscar todos os produtos com estoque disponível, ordenados por preço
JSON para Importar
{
"name": "Buscar Produtos em Estoque",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Buscar Produtos",
"operation": "find",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "ecommerce"
},
"collection": "produtos",
"query": {
"estoque": { "$gt": 0 },
"ativo": true
},
"sort": { "preco": 1 },
"responseVariable": "produtosDisponiveis"
}
},
{
"id": "condition_1",
"type": "condition",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Tem Produtos?",
"conditions": [
{
"variable": "produtosDisponiveis.count",
"operator": "greater_than",
"value": "0",
"targetNode": "message_success"
}
],
"defaultTarget": "message_empty"
}
},
{
"id": "message_success",
"type": "message",
"position": { "x": 700, "y": 50 },
"data": {
"label": "Sucesso",
"parameters": {
"message": "✅ Encontrados {{produtosDisponiveis.count}} produtos disponíveis!"
}
}
},
{
"id": "message_empty",
"type": "message",
"position": { "x": 700, "y": 150 },
"data": {
"label": "Vazio",
"parameters": {
"message": "⚠️ Nenhum produto disponível no momento"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "condition_1" },
{ "source": "message_success", "target": "end_1" },
{ "source": "message_empty", "target": "end_1" }
]
}
Saída esperada:
Sistema: ✅ Encontrados 15 produtos disponíveis!
Exemplo 2: Paginação de Clientes
Objetivo: Implementar paginação para listar clientes de 10 em 10
JSON para Importar
{
"name": "Paginação de Clientes",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 250, "y": 100 },
"data": {
"label": "Definir Página",
"parameters": {
"variables": [
{ "name": "pagina", "value": "1" },
{ "name": "porPagina", "value": "10" }
]
}
}
},
{
"id": "calculator_1",
"type": "calculator",
"position": { "x": 400, "y": 100 },
"data": {
"label": "Calcular Skip",
"operation": "multiply",
"values": ["{{pagina}}", "{{porPagina}}"],
"resultVariable": "skip"
}
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 550, "y": 100 },
"data": {
"label": "Buscar Página",
"operation": "find",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "crm"
},
"collection": "clientes",
"query": {},
"limit": "{{porPagina}}",
"skip": "{{skip}}",
"sort": { "nome": 1 },
"responseVariable": "clientesPagina"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Mostrar Página",
"parameters": {
"message": "📄 Página {{pagina}}: {{clientesPagina.count}} clientes"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 850, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "calculator_1" },
{ "source": "calculator_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: 📄 Página 1: 10 clientes
Exemplo 3: Busca com Variáveis Dinâmicas
Objetivo: Buscar pedidos de um cliente específico usando variáveis do contexto
JSON para Importar
{
"name": "Buscar Pedidos do Cliente",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 250, "y": 100 },
"data": {
"label": "ID do Cliente",
"parameters": {
"message": "Digite o ID do cliente:",
"variable": "clienteId"
}
}
},
{
"id": "mongodb_1",
"type": "mongodb",
"position": { "x": 400, "y": 100 },
"data": {
"label": "Buscar Pedidos",
"operation": "find",
"config": {
"connectionString": "mongodb://localhost:27017",
"database": "vendas"
},
"collection": "pedidos",
"query": {
"clienteId": "{{clienteId}}",
"status": { "$ne": "cancelado" }
},
"sort": { "dataCriacao": -1 },
"responseVariable": "pedidos"
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 550, "y": 100 },
"data": {
"label": "Mostrar Resultado",
"parameters": {
"message": "🛒 Cliente {{clienteId}}: {{pedidos.count}} pedidos ativos"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "mongodb_1" },
{ "source": "mongodb_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: Digite o ID do cliente:
Usuário: 507f1f77bcf86cd799439011
Sistema: 🛒 Cliente 507f1f77bcf86cd799439011: 3 pedidos ativos
Resposta do Node
{
"documents": [
{
"_id": "507f1f77bcf86cd799439011",
"nome": "Produto 1",
"preco": 99.90,
"estoque": 10
},
{
"_id": "507f1f77bcf86cd799439012",
"nome": "Produto 2",
"preco": 149.90,
"estoque": 5
}
],
"count": 2
}
Boas Práticas
✅ SIM:
- Use
limitpara evitar buscar milhares de documentos de uma vez - Combine
limiteskippara implementar paginação eficiente - Use índices no MongoDB para queries que serão executadas frequentemente
- Filtre o máximo possível na
queryao invés de processar depois - Use
sortquando precisar de resultados ordenados - Armazene resultado em
responseVariablepara usar em nodes seguintes - Valide se
count > 0antes de processar documentos
❌ NÃO:
- Não busque todos os documentos sem limit em coleções grandes
- Não ignore a configuração de
sortpara resultados consistentes - Não esqueça de fechar conexões (o executor faz automaticamente)
- Não use FIND quando precisa de apenas 1 documento (use FIND_ONE)
- Não faça queries complexas sem índices apropriados
Dicas
💡 Dica 1: Para paginação, calcule skip = (pagina - 1) * limit antes de chamar o node
💡 Dica 2: ObjectIds são automaticamente convertidos quando você busca por _id como string
💡 Dica 3: Use { $exists: true } para buscar documentos que têm um campo específico
💡 Dica 4: Combine múltiplos filtros no objeto query para buscas mais precisas
💡 Dica 5: Para queries de texto completo, configure text indexes no MongoDB primeiro
Próximos Nodes
→ MONGODB FIND_ONE - Buscar um único documento → MONGODB INSERT - Inserir novos documentos → MONGODB UPDATE - Atualizar documentos existentes → MONGODB AGGREGATE - Executar pipelines de agregação