$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.

CategoriaAgrupamento e Janela
Versão do MongoDB1.0+
Idioma do Exemplomongosh (Shell)

📝 Sintaxe

{ $facet: { <outputField1>: [ <sub-pipeline1> ], <outputField2>: [ <sub-pipeline2> ] } }

⚙️ Parâmetros

subpipelineNomes 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

📚 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.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%