Sumário
- Entendendo Left Joins e a Abordagem do MongoDB
- Dominando o Operador $lookup
- Refino dos Resultados com Filtragem
- Técnicas Avançadas de Agregação
- Otimizando o Desempenho
- Perguntas Frequentes
Entendendo Left Joins e a Abordagem do MongoDB
Em bancos de dados SQL, um left join garante que todas as linhas da tabela da esquerda sejam incluídas no conjunto de resultados. Se uma linha correspondente existir na tabela da direita, os dados correspondentes são unidos; caso contrário, os campos do lado direito são preenchidos com valores NULL. O MongoDB, sendo um banco de dados NoSQL, não possui um comando “LEFT JOIN” direto. No entanto, podemos alcançar a mesma funcionalidade usando o poderoso operador $lookup
dentro da estrutura de agregação.
Dominando o Operador $lookup
O operador $lookup
junta documentos de duas coleções com base em campos especificados. É crucial entender que ele retorna todos os documentos da coleção “esquerda”, independentemente de uma correspondência ser encontrada na coleção “direita”. Vamos examinar sua sintaxe:
db.collection1.aggregate([
{
$lookup: {
from: "collection2", // Coleção da direita
localField: "field1", // Campo em collection1 para correspondência
foreignField: "field2", // Campo em collection2 para correspondência
as: "results" // Campo de array para armazenar documentos correspondentes
}
}
])
Considere duas coleções: customers
e orders
.
Coleção customers:
_id | name | city |
---|---|---|
1 | John Doe | Nova York |
2 | Jane Smith | Londres |
3 | Peter Jones | Paris |
Coleção orders:
_id | customer_id | amount |
---|---|---|
1 | 1 | 100 |
2 | 1 | 200 |
3 | 2 | 50 |
Para executar um left join, usamos $lookup
:
db.customers.aggregate([
{
$lookup: {
from: "orders",
localField: "_id",
foreignField: "customer_id",
as: "orders"
}
}
])
Isso retorna todos os clientes. Aqueles com pedidos terão um array orders
preenchido; aqueles sem terão um array vazio.
Refino dos Resultados com Filtragem
O estágio $match
permite filtragem pós-junção. Por exemplo, para encontrar clientes com pedidos superiores a US$ 100:
db.customers.aggregate([
{
$lookup: { /* ... (mesmo $lookup acima) ... */ }
},
{
$match: {
"orders.amount": { $gt: 100 }
}
}
])
Técnicas Avançadas de Agregação
A flexibilidade do pipeline de agregação se estende além de $lookup
e $match
. Estágios como $unwind
(para desconstruir arrays), $group
(para agregar dados) e $sort
(para ordenar resultados) podem ser incorporados para transformações de dados complexas. Por exemplo, para calcular o gasto total de cada cliente:
db.customers.aggregate([
{
$lookup: { /* ... (mesmo $lookup acima) ... */ }
},
{ $unwind: "$orders" },
{
$group: {
_id: "$_id",
name: { $first: "$name" },
totalSpent: { $sum: "$orders.amount" }
}
}
])
Otimizando o Desempenho
Para conjuntos de dados grandes, o desempenho é primordial. Indexar os campos usados em localField
e foreignField
é crucial. A indexação eficiente acelera significativamente a operação de junção. Analise seu pipeline de agregação para eliminar estágios desnecessários e otimizar a eficiência da consulta.
Perguntas Frequentes
P: E se field1
ou field2
puderem ter várias correspondências? R: $lookup
retornará todos os documentos correspondentes no array results
. Use $unwind
para processar cada um individualmente.
P: Posso executar um RIGHT JOIN? R: Não diretamente. Inverta as coleções em $lookup
e trate os documentos não correspondentes de acordo.
P: Como lidar com o desempenho com coleções enormes? R: Indexação é essencial. Otimize seu pipeline para minimizar o processamento.