As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
$facet
Novo na versão 8.0.2.
O estágio $facet de agregação no Amazon DocumentDB processa vários pipelines de agregação em um único estágio no mesmo conjunto de documentos de entrada. Cada campo de saída define seu próprio pipeline e cada pipeline recebe os mesmos documentos de entrada. Isso permite calcular várias agregações independentes, como contagens, agrupamentos e estatísticas resumidas, em uma única consulta, em vez de executar a coleção por meio de várias consultas separadas.
Cada subpipeline é executado de forma independente e produz uma matriz de documentos que são armazenados em seu campo de saída correspondente. Como os subpipelines não compartilham o estado, a saída de um pipeline não afeta outro.
Sintaxe
{ $facet: { <outputField1>: [ <stage1>, <stage2>, ... ], <outputField2>: [ <stage1>, <stage2>, ... ], ... } }
Parâmetros
-
outputField(obrigatório): o nome de um campo de saída que contém a matriz de resultados do pipeline de agregação associado. Você pode especificar um ou mais campos de saída. Cada campo de saída é mapeado para uma matriz de estágios do pipeline de agregação que é aplicada aos documentos de entrada.
Saída
O $facet estágio retorna um único documento. Cada campo de saída que você especificar contém uma matriz de documentos produzidos pelo subpipeline correspondente.
Limitações
-
Um
$facetsubpipeline não pode incluir os seguintes estágios:$changeStream,$collStats,$facet(o aninhamento não é permitido)$geoNear,$indexStats,$listSearchIndexes,$merge,$out,$planCacheStats,$search$searchMeta, e.$vectorSearch -
O documento que o
$facetestágio retorna deve permanecer dentro do limite de tamanho do documento BSON de 16 MB. -
Um
$sortestágio anterior a um$facetestágio não pode determinar a ordem de um acumulador sensível à ordem ($first,,,$last$push$firstN$lastN, ou$mergeObjects) em um$bucketAutoestágio$group,$bucket, ou quando essa ordem precisaria ser aplicada além do limite.$facetIsso se aplica se o estágio de agrupamento estiver dentro de um$facetsubpipeline ou após o$facetestágio. Nesse caso, o Amazon DocumentDB retorna um erro em vez de executar o pipeline. Para solicitar esse acumulador, coloque o$sortestágio dentro da$facetsubtubulação, imediatamente antes do estágio de agrupamento. Order-insensitive acumuladores, como$sum,$min, e$max$count, não são afetados.
Exemplo (MongoDB Shell)
O exemplo a seguir demonstra como usar o $facet estágio para calcular várias agregações sobre os mesmos dados de vendas em uma única consulta.
Crie documentos de amostra
db.sales.insertMany([ { item: "abc", price: 10, quantity: 2, date: new Date("2020-09-01") }, { item: "def", price: 20, quantity: 1, date: new Date("2020-10-01") }, { item: "ghi", price: 5, quantity: 3, date: new Date("2020-11-01") }, { item: "jkl", price: 15, quantity: 2, date: new Date("2020-12-01") }, { item: "abc", price: 25, quantity: 1, date: new Date("2021-01-01") } ]);
Exemplo de consulta
O comando a seguir é usado $facet para calcular, em um único estágio, a quantidade total vendida por item, as estatísticas gerais de preços e a contagem total de documentos:
db.sales.aggregate([ { $facet: { "totalByItem": [ { $group: { _id: "$item", totalQuantity: { $sum: "$quantity" } } } ], "priceStats": [ { $group: { _id: null, avgPrice: { $avg: "$price" }, maxPrice: { $max: "$price" } } } ], "documentCount": [ { $count: "total" } ] } } ])
Saída
O comando retorna a seguinte saída:
[
{
totalByItem: [
{ _id: "abc", totalQuantity: 3 },
{ _id: "def", totalQuantity: 1 },
{ _id: "ghi", totalQuantity: 3 },
{ _id: "jkl", totalQuantity: 2 }
],
priceStats: [
{ _id: null, avgPrice: 15, maxPrice: 25 }
],
documentCount: [
{ total: 5 }
]
}
]
Exemplos de código
Para ver um exemplo de código para usar o $facet comando, escolha a guia do idioma que você deseja usar: