View a markdown version of this page

$facet - Amazon DocumentDB

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

$facet

Baru dari versi 8.0.2.

T $facet ahap agregasi di Amazon DocumentDB memproses beberapa pipeline agregasi dalam satu tahap pada kumpulan dokumen input yang sama. Setiap bidang keluaran mendefinisikan pipelnya sendiri, dan setiap pipeline menerima dokumen input yang sama. Ini memungkinkan Anda menghitung beberapa agregasi independen, seperti jumlah, pengelompokan, dan statistik ringkasan, dalam satu kueri alih-alih menjalankan koleksi melalui beberapa kueri terpisah.

Setiap sub-pipeline berjalan secara independen dan menghasilkan array dokumen yang disimpan di bidang output yang sesuai. Karena sub-pipeline tidak berbagi status, output dari satu pipa tidak mempengaruhi yang lain.

Sintaksis

{ $facet: { <outputField1>: [ <stage1>, <stage2>, ... ], <outputField2>: [ <stage1>, <stage2>, ... ], ... } }

Parameter

  • outputField(wajib): Nama bidang keluaran yang menyimpan array hasil dari pipeline agregasi terkait. Anda dapat menentukan satu atau lebih bidang keluaran. Setiap bidang keluaran memetakan ke array tahapan pipa agregasi yang diterapkan ke dokumen input.

Keluaran

T $facet ahap mengembalikan satu dokumen. Setiap bidang keluaran yang Anda tentukan berisi array dokumen yang dihasilkan oleh sub-pipeline yang sesuai.

Batasan

  • $facetSub-pipeline tidak dapat menyertakan tahapan berikut: $changeStream$collStats,, $facet (bersarang tidak diperbolehkan)$geoNear,$indexStats,$listSearchIndexes,$merge,$out,$planCacheStats,, $search$searchMeta, dan$vectorSearch.

  • Dokumen yang dikem $facet balikan tahap harus tetap dalam batas ukuran dokumen BSON 16 MB.

  • T $sort ahap yang datang sebelum $facet tahap tidak dapat menentukan urutan akumulator peka urutan ($first,$last,$push,$firstN,$lastN, atau$mergeObjects) dalam $bucketAuto tahap$group,$bucket, atau ketika urutan itu harus diterapkan melintasi batas. $facet Ini berlaku apakah tahap pengelompokan berada di dalam $facet sub-pipeline atau setelah $facet tahap. Dalam hal ini, Amazon DocumentDB mengembalikan kesalahan alih-alih menjalankan pipeline. Untuk memesan akumulator seperti itu, letakkan pang $sort gung di dalam $facet sub-pipa, segera sebelum tahap pengelompokan. Order-insensitive akumulator, seperti$sum,,$min, dan $max$count, tidak terpengaruh.

Contoh (MongoDB Shell)

Contoh berikut menunjukkan bagaimana menggunakan $facet tahap untuk menghitung beberapa agregasi atas data penjualan yang sama dalam satu kueri.

Buat dokumen sampel

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") } ]);

Contoh kueri

Perintah berikut digunakan $facet untuk menghitung, dalam satu tahap, jumlah total yang terjual per item, statistik harga keseluruhan, dan jumlah dokumen total:

db.sales.aggregate([ { $facet: { "totalByItem": [ { $group: { _id: "$item", totalQuantity: { $sum: "$quantity" } } } ], "priceStats": [ { $group: { _id: null, avgPrice: { $avg: "$price" }, maxPrice: { $max: "$price" } } } ], "documentCount": [ { $count: "total" } ] } } ])

Keluaran

Perintah mengembalikan output berikut:

[ { 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 } ] } ]

Contoh kode

Untuk melihat contoh kode untuk menggunakan $facet perintah, pilih tab untuk bahasa yang ingin Anda gunakan:

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