

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
<a name="facet"></a>

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)
<a name="facet-examples"></a>

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
<a name="facet-code"></a>

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()
```

------