View a markdown version of this page

$facet - Amazon DocumentDB

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 $facet pipeline secondaria non può includere le seguenti fasi:$changeStream,$collStats, $facet (la nidificazione non è consentita),,,,$geoNear,$indexStats,$listSearchIndexes, $merge$out, $planCacheStats e. $search $searchMeta $vectorSearch

  • Il documento restituito $facet dallo stage deve rimanere entro il limite di dimensione del documento BSON di 16 MB.

  • Una $sort fase che precede una $facet fase non può determinare l'ordine di un accumulatore sensibile all'ordine ($first,,,$last, $push $firstN$lastN, o$mergeObjects) in una$group,$bucket, o $bucketAuto fase in cui tale ordinamento dovrebbe essere applicato oltre i confini. $facet Ciò vale sia che la fase di raggruppamento si trovi all'interno di una $facet sottopipeline o dopo la fase. $facet In questo caso, Amazon DocumentDB restituisce un errore invece di eseguire la pipeline. Per ordinare un accumulatore di questo tipo, posiziona lo $sort stage all'interno della $facet sottopipeline, 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:

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