View a markdown version of this page

$facet - Amazon DocumentDB

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 $facet Subpipeline darf die folgenden Stufen nicht enthalten:$changeStream,$collStats, $facet (Verschachtelung ist nicht zulässig)$geoNear,$indexStats,$listSearchIndexes,,$merge, $out $planCacheStats$search, $searchMeta und. $vectorSearch

  • Das Dokument, das von der $facet Phase zurückgegeben wird, muss innerhalb der Größenbeschränkung von 16 MB für BSON-Dokumente bleiben.

  • Eine $sort Stufe, die vor einer $facet Stufe liegt, kann nicht die Reihenfolge eines Akkumulators ($first,, $last $push$firstN, oder$mergeObjects) in einer$lastN, $bucketAuto O-Stufe bestimmen $group$bucket, wenn diese Reihenfolge über die Grenze hinweg angewendet werden müsste. $facet Dies gilt unabhängig davon, ob sich die Gruppierungsphase innerhalb einer $facet Unterleitung oder hinter der Stufe befindet. $facet In diesem Fall gibt Amazon DocumentDB einen Fehler zurück, anstatt die Pipeline auszuführen. Um einen solchen Akkumulator zu bestellen, platzieren Sie die $sort Stufe in der $facet Subpipeline, 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:

Node.js
const { MongoClient } = require('mongodb'); async function example() { const client = await MongoClient.connect('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false'); const db = client.db('test'); const sales = db.collection('sales'); const result = await sales.aggregate([ { $facet: { "totalByItem": [ { $group: { _id: "$item", totalQuantity: { $sum: "$quantity" } } } ], "priceStats": [ { $group: { _id: null, avgPrice: { $avg: "$price" }, maxPrice: { $max: "$price" } } } ], "documentCount": [ { $count: "total" } ] } } ]).toArray(); console.log(result); client.close(); } example();
Python
from pymongo import MongoClient def example(): client = MongoClient('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false') db = client['test'] sales = db['sales'] result = list(sales.aggregate([ { '$facet': { 'totalByItem': [ {'$group': {'_id': '$item', 'totalQuantity': {'$sum': '$quantity'}}} ], 'priceStats': [ {'$group': {'_id': None, 'avgPrice': {'$avg': '$price'}, 'maxPrice': {'$max': '$price'}}} ], 'documentCount': [ {'$count': 'total'} ] } } ])) print(result) client.close() example()