$facet (Agregação Multifacetada)
Última atualização: 2026-10-09
$facet (Agregação Multifacetada)
$facet executa vários sub-pipelines em paralelo dentro de um único estágio, cada um processando os mesmos documentos de entrada, e mescla os resultados como campos: { nome: [ resultados ] }. Obtenha estatísticas resumidas, listas de detalhes e top-N em uma única requisição em vez de múltiplas idas e vindas. Os sub-pipelines são independentes.
| Categoria | Agrupamento e Janela |
|---|---|
| Versão do MongoDB | 1.0+ |
| Idioma do Exemplo | mongosh (Shell) |
📝 Sintaxe
{ $facet: { <outputField1>: [ <sub-pipeline1> ], <outputField2>: [ <sub-pipeline2> ] } }
⚙️ Parâmetros
| subpipeline | Nomes de campo mapeados para matrizes de subpipeline, cada uma processando a entrada independentemente. |
|---|
Retorno:Um único documento cujos campos contêm a matriz de resultados de cada subpipeline
▶ Exemplo
Execute os comandos abaixo no seu mongosh local (requer um mongod em execução):
// $facet: divisão por status mais top 5 por valor
db.orders.aggregate([
{ $facet: {
byStatus: [{ $group: { _id: '$status', n: { $sum: 1 } } }],
top5: [{ $sort: { amount: -1 } }, { $limit: 5 }]
} }
])
Saída:
{ "byStatus": [ { "_id": "A", "n": 20 } ], "top5": [ { ... } ] }
📌 Notas
- Os sub-pipelines não podem conter estágios como $out, $merge ou $facet
- Os sub-pipelines são independentes; cada um vê a entrada completa
- A saída é um único documento com um array por nome de sub-pipeline
🏷️ Tags Relacionados
💡 Casos Relacionados
Pipelines de agregação avançados: expressões e transformações complexas
Prática: CRUD para um sistema de comentários de blog
$facet + $bucket + Pesquisa de texto/geoespacial
$lookup e associações com múltiplos conjuntos
📚 Tutoriais Relacionados
❓ Perguntas Frequentes
QOs sub-pipelines podem ordenar dentro de $facet?
ASim, os sub-pipelines podem usar estágios normais como $sort e $limit.
Q$facet é mais rápido que várias chamadas de aggregate?
AGeralmente sim: uma única passada atende a várias agregações, reduzindo E/S e idas e vindas.
QQual é a forma de saída de $facet?
AUm único documento; cada nome de sub-pipeline mapeia para um array de resultados.