Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
$facet
Nuovo dalla versione 8.0.2.
La fase di $facet aggregazione in Amazon DocumentDB elabora più pipeline di aggregazione in un'unica fase sullo stesso set di documenti di input. Ogni campo di output definisce la propria pipeline e ogni pipeline riceve gli stessi documenti di input. Ciò consente di calcolare diverse aggregazioni indipendenti, come conteggi, raggruppamenti e statistiche di riepilogo, in una singola query invece di eseguire la raccolta tramite più query separate.
Ogni sottopipeline viene eseguita in modo indipendente e produce una serie di documenti archiviati nel campo di output corrispondente. Poiché le pipeline secondarie non condividono lo stato, l'output di una pipeline non influisce su un'altra.
Sintassi
{ $facet: { <outputField1>: [ <stage1>, <stage2>, ... ], <outputField2>: [ <stage1>, <stage2>, ... ], ... } }
Parametri
-
outputField(obbligatorio): il nome di un campo di output che contiene l'array di risultati della pipeline di aggregazione associata. È possibile specificare uno o più campi di output. Ogni campo di output è mappato a una serie di fasi della pipeline di aggregazione che viene applicata ai documenti di input.
Output
Lo $facet stage restituisce un singolo documento. Ogni campo di output specificato contiene una serie di documenti prodotti dalla corrispondente sottopipeline.
Limitazioni
-
Una
$facetpipeline secondaria non può includere le seguenti fasi:$changeStream,$collStats,$facet(la nidificazione non è consentita),,,,$geoNear,$indexStats,$listSearchIndexes,$merge$out,$planCacheStatse.$search$searchMeta$vectorSearch -
Il documento restituito
$facetdallo stage deve rimanere entro il limite di dimensione del documento BSON di 16 MB. -
Una
$sortfase che precede una$facetfase non può determinare l'ordine di un accumulatore sensibile all'ordine ($first,,,$last,$push$firstN$lastN, o$mergeObjects) in una$group,$bucket, o$bucketAutofase in cui tale ordinamento dovrebbe essere applicato oltre i confini.$facetCiò vale sia che la fase di raggruppamento si trovi all'interno di una$facetsottopipeline o dopo la fase.$facetIn questo caso, Amazon DocumentDB restituisce un errore invece di eseguire la pipeline. Per ordinare un accumulatore di questo tipo, posiziona lo$sortstage all'interno della$facetsottopipeline, immediatamente prima della fase di raggruppamento. Order-insensitive gli accumulatori, quali,, e$sum$min$max$count, non sono interessati.
Esempio (MongoDB Shell)
L'esempio seguente dimostra come utilizzare lo $facet stage per calcolare diverse aggregazioni sugli stessi dati di vendita in una singola query.
Crea documenti di esempio
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") } ]);
Esempio di interrogazione
Il comando seguente viene utilizzato $facet per calcolare, in un'unica fase, la quantità totale venduta per articolo, le statistiche complessive dei prezzi e il numero totale di documenti:
db.sales.aggregate([ { $facet: { "totalByItem": [ { $group: { _id: "$item", totalQuantity: { $sum: "$quantity" } } } ], "priceStats": [ { $group: { _id: null, avgPrice: { $avg: "$price" }, maxPrice: { $max: "$price" } } } ], "documentCount": [ { $count: "total" } ] } } ])
Output
Questo comando restituisce il seguente output:
[
{
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 }
]
}
]
Esempi di codice
Per visualizzare un esempio di codice per l'utilizzo del $facet comando, scegli la scheda corrispondente alla lingua che desideri utilizzare: