Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
$facet
Neu ab Version 8.0.2.
Die $facet Aggregationsphase in Amazon DocumentDB verarbeitet mehrere Aggregationspipelines innerhalb einer einzigen Stufe für denselben Satz von Eingabedokumenten. Jedes Ausgabefeld definiert seine eigene Pipeline, und jede Pipeline erhält dieselben Eingabedokumente. Auf diese Weise können Sie mehrere unabhängige Aggregationen, wie Anzahlen, Gruppierungen und zusammenfassende Statistiken, in einer einzigen Abfrage berechnen, anstatt die Sammlung durch mehrere separate Abfragen ausführen zu müssen.
Jede Subpipeline läuft unabhängig und erzeugt eine Reihe von Dokumenten, die in dem entsprechenden Ausgabefeld gespeichert werden. Da die Sub-Pipelines keinen gemeinsamen Status haben, wirkt sich die Ausgabe einer Pipeline nicht auf eine andere aus.
Syntax
{ $facet: { <outputField1>: [ <stage1>, <stage2>, ... ], <outputField2>: [ <stage1>, <stage2>, ... ], ... } }
Parameter
-
outputField(erforderlich): Der Name eines Ausgabefeldes, das das Ergebnisarray der zugehörigen Aggregationspipeline enthält. Sie können ein oder mehrere Ausgabefelder angeben. Jedes Ausgabefeld ist einer Reihe von Aggregationspipeline-Stufen zugeordnet, die auf die Eingabedokumente angewendet werden.
Ausgabe
Die $facet Stufe gibt ein einzelnes Dokument zurück. Jedes von Ihnen angegebene Ausgabefeld enthält eine Reihe von Dokumenten, die von der entsprechenden Subpipeline erstellt wurden.
Einschränkungen
-
Eine
$facetSubpipeline darf die folgenden Stufen nicht enthalten:$changeStream,$collStats,$facet(Verschachtelung ist nicht zulässig)$geoNear,$indexStats,$listSearchIndexes,,$merge,$out$planCacheStats$search,$searchMetaund.$vectorSearch -
Das Dokument, das von der
$facetPhase zurückgegeben wird, muss innerhalb der Größenbeschränkung von 16 MB für BSON-Dokumente bleiben. -
Eine
$sortStufe, die vor einer$facetStufe liegt, kann nicht die Reihenfolge eines Akkumulators ($first,,$last$push$firstN, oder$mergeObjects) in einer$lastN,$bucketAutoO-Stufe bestimmen$group$bucket, wenn diese Reihenfolge über die Grenze hinweg angewendet werden müsste.$facetDies gilt unabhängig davon, ob sich die Gruppierungsphase innerhalb einer$facetUnterleitung oder hinter der Stufe befindet.$facetIn diesem Fall gibt Amazon DocumentDB einen Fehler zurück, anstatt die Pipeline auszuführen. Um einen solchen Akkumulator zu bestellen, platzieren Sie die$sortStufe in der$facetSubpipeline, unmittelbar vor der Gruppierungsphase. Order-insensitive Akkumulatoren wie,$sum, und$min$max$count, sind nicht betroffen.
Beispiel (MongoDB Shell)
Das folgende Beispiel zeigt, wie der $facet Stagingbereich verwendet wird, um mehrere Aggregationen für dieselben Verkaufsdaten in einer einzigen Abfrage zu berechnen.
Erstellen Sie Beispieldokumente
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") } ]);
Beispiel für eine Abfrage
Der folgende Befehl wird verwendet, $facet um in einem einzigen Schritt die gesamte verkaufte Menge pro Artikel, die Gesamtpreisstatistiken und die Gesamtzahl der Dokumente zu berechnen:
db.sales.aggregate([ { $facet: { "totalByItem": [ { $group: { _id: "$item", totalQuantity: { $sum: "$quantity" } } } ], "priceStats": [ { $group: { _id: null, avgPrice: { $avg: "$price" }, maxPrice: { $max: "$price" } } } ], "documentCount": [ { $count: "total" } ] } } ])
Ausgabe
Der Befehl gibt die folgende Ausgabe zurück:
[
{
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 }
]
}
]
Codebeispiele
Um ein Codebeispiel für die Verwendung des $facet Befehls anzuzeigen, wählen Sie die Registerkarte für die Sprache, die Sie verwenden möchten: