

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

# $facet
<a name="facet"></a>

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**
+ `$facet`Sub-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)
<a name="facet-examples"></a>

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

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

------