

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

# $ set WindowFields
<a name="setWindowFields"></a>

Baru dari versi 8.0.2.

T `$setWindowFields` ahap di Amazon DocumentDB melakukan operasi pada rentang dokumen tertentu (*jendela*) di partisi, dan mengembalikan hasil berdasarkan operator jendela yang dipilih. Tahap mengelompokkan dokumen input ke dalam partisi, secara opsional mengurutkannya, dan untuk setiap dokumen menghitung satu atau lebih bidang keluaran di atas jendela dokumen di sekitarnya.

**Sintaksis**

```
{
  $setWindowFields: {
    partitionBy: <expression>,
    sortBy: { <sortField1>: <sortOrder>, ... },
    output: {
      <outputField1>: {
        <windowOperator>: <expression>,
        window: {
          documents: [ <lowerBound>, <upperBound> ],
          range: [ <lowerBound>, <upperBound> ],
          unit: <time unit>
        }
      },
      ...
    }
  }
}
```

**Parameter**
+ `partitionBy`: Opsional. Ekspresi tunggal yang digunakan untuk mengelompokkan dokumen ke dalam partisi. Ini bisa berupa jalur bidang (misalnya,`"$state"`) atau ekspresi lain. Jika dihilangkan, semua dokumen input milik satu partisi.
+ `sortBy`: Opsional. Dokumen yang menentukan bidang atau bidang untuk mengurutkan dokumen di setiap partisi berdasarkan, dalam bentuk `{ <field>: 1 }` untuk urutan menaik atau `{ <field>: -1 }` untuk urutan menurun. A `sortBy` diperlukan saat Anda menggunakan batas jendela berbasis dokumen atau berbasis rentang, dan saat Anda menggunakan salah satu operator peringkat.
+ `output`: Diperlukan. Dokumen yang menentukan bidang yang akan ditambahkan ke setiap dokumen. Anda dapat menentukan beberapa bidang keluaran, tetapi setiap bidang keluaran membutuhkan tepat satu operator jendela, argumennya, dan `window` dokumen opsional yang mendefinisikan batas jendela:`{ <field>: { <windowOperator>: <expression>, window: { ... } } }`.

## Batas jendela
<a name="setWindowFields-bounds"></a>

Dalam setiap `output` bidang Anda dapat secara opsional menentukan batas jendela dengan `window` dokumen. Jendela dapat ditentukan oleh posisi dokumen atau dengan rentang nilai.
+ `documents`: Menentukan jendela sebagai sejumlah dokumen sebelum dan sesudah dokumen saat ini, dalam formulir`[ <lowerBound>, <upperBound> ]`. Setiap ikatan adalah offset integer (misalnya, `-1` atau`2`), atau salah satu kata kunci `"unbounded"` dan`"current"`. `"unbounded"`memperluas jendela ke awal partisi ketika digunakan sebagai batas bawah, atau ke akhir partisi ketika digunakan sebagai batas atas. `"current"`berarti dokumen saat ini. Sebuah `documents` jendela membutuhkan a `sortBy` kecuali kedua batasnya ada`"unbounded"`.
+ `range`: Menentukan jendela sebagai rentang nilai `sortBy` bidang relatif terhadap dokumen saat ini, dalam formulir`[ <lowerBound>, <upperBound> ]`. Setiap ikatan adalah angka yang ditambahkan ke `sortBy` nilai dokumen saat ini, atau `"unbounded"` kata kunci. Sebuah `range` jendela membutuhkan tepat satu `sortBy` bidang menaik dan tidak menerima `"current"` kata kunci.
+ `unit`: Opsional. Digunakan `range` untuk menafsirkan batas jendela numerik sebagai rentang waktu ketika `sortBy` bidang menyimpan nilai tanggal. Amazon DocumentDB mendukung unit berikut:`"year"`,,`"quarter"`,`"month"`,`"week"`,`"day"`,`"hour"`, `"minute"``"second"`, dan`"millisecond"`. Ketika `unit` ditentukan, `range` batas harus bilangan bulat.

Ketika `window` dokumen dihilangkan, jendela default adalah`documents: ["unbounded", "unbounded"]`, yang mencakup seluruh partisi.

**catatan**  
Saat Anda menggunakan `range` jendela di atas nilai tanggal, kami merekomendasikan durasi tetap `unit` seperti `"day"` (atau lebih kecil) daripada`"month"`,, atau `"quarter"``"year"`, yang panjangnya bergantung pada kalender dapat menghasilkan batas jendela yang ambigu.

## Operator jendela yang didukung
<a name="setWindowFields-operators"></a>

Amazon DocumentDB mendukung 26 operator jendela berikut di `output` bidang pang `$setWindowFields` gung:
+ `$sum`
+ `$avg`
+ `$count`
+ `$push`
+ `$addToSet`
+ `$stdDevPop`
+ `$stdDevSamp`
+ `$covariancePop`
+ `$covarianceSamp`
+ `$first`
+ `$last`
+ `$firstN`
+ `$lastN`
+ `$top`
+ `$bottom`
+ `$topN`
+ `$bottomN`
+ `$min`
+ `$minN`
+ `$max`
+ `$maxN`
+ `$median`
+ `$percentile`
+ `$rank`
+ `$denseRank`
+ `$documentNumber`

**catatan**  
`$rand`Operator tidak didukung dalam operator jendela di pang `$setWindowFields` gung.

**Jendela kosong **

Ketika jendela tidak berisi dokumen (misalnya, `range` jendela tanpa nilai dalam rentang), hasilnya tergantung pada operator: `$count` dan `$sum` mengembalikan`0`;`$push`,,,`$addToSet`,`$firstN`,`$lastN`, `$minN` `$maxN``$topN`, dan `$bottomN` mengembalikan array kosong; `$percentile` mengembalikan array `null` nilai (satu per persentil yang diminta); semua operator lain kembali. `null`

## Contoh (MongoDB Shell)
<a name="setWindowFields-examples"></a>

Contoh berikut mempartisi dokumen berdasarkan`region`, mengurutkan setiap partisi berdasarkan`day`, dan menghitung total berjalan `revenue` dari awal partisi melalui dokumen saat ini.

**Buat dokumen sampel **

```
db.sales.insertMany([
  { _id: 1, region: "east", day: 1, revenue: 100 },
  { _id: 2, region: "east", day: 2, revenue: 150 },
  { _id: 3, region: "east", day: 3, revenue: 120 },
  { _id: 4, region: "west", day: 1, revenue: 200 },
  { _id: 5, region: "west", day: 2, revenue: 180 }
]);
```

**Contoh kueri **

```
db.sales.aggregate([
  {
    $setWindowFields: {
      partitionBy: "$region",
      sortBy: { day: 1 },
      output: {
        runningRevenue: {
          $sum: "$revenue",
          window: { documents: ["unbounded", "current"] }
        }
      }
    }
  }
]);
```

**Keluaran **

```
[
  { "_id": 1, "region": "east", "day": 1, "revenue": 100, "runningRevenue": 100 },
  { "_id": 2, "region": "east", "day": 2, "revenue": 150, "runningRevenue": 250 },
  { "_id": 3, "region": "east", "day": 3, "revenue": 120, "runningRevenue": 370 },
  { "_id": 4, "region": "west", "day": 1, "revenue": 200, "runningRevenue": 200 },
  { "_id": 5, "region": "west", "day": 2, "revenue": 180, "runningRevenue": 380 }
]
```

Setiap dokumen ditambah dengan`runningRevenue`, jumlah kumulatif dari `revenue` dalam partisinya hingga dan termasuk dokumen saat ini.

## Contoh kode
<a name="setWindowFields-code"></a>

Untuk melihat contoh kode untuk menggunakan pang `$setWindowFields` gung, pilih tab untuk bahasa yang ingin Anda gunakan:

------
#### [ Node.js ]

```
const { MongoClient } = require('mongodb');

async function example() {
  const client = new MongoClient('mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false');

  try {
    await client.connect();
    const db = client.db('test');
    const sales = db.collection('sales');

    await sales.insertMany([
      { _id: 1, region: "east", day: 1, revenue: 100 },
      { _id: 2, region: "east", day: 2, revenue: 150 },
      { _id: 3, region: "east", day: 3, revenue: 120 },
      { _id: 4, region: "west", day: 1, revenue: 200 },
      { _id: 5, region: "west", day: 2, revenue: 180 }
    ]);

    const result = await sales.aggregate([
      {
        $setWindowFields: {
          partitionBy: "$region",
          sortBy: { day: 1 },
          output: {
            runningRevenue: {
              $sum: "$revenue",
              window: { documents: ["unbounded", "current"] }
            }
          }
        }
      }
    ]).toArray();

    console.log(result);
  } finally {
    await 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')

    try:
        db = client['test']
        sales = db['sales']

        sales.insert_many([
            { '_id': 1, 'region': 'east', 'day': 1, 'revenue': 100 },
            { '_id': 2, 'region': 'east', 'day': 2, 'revenue': 150 },
            { '_id': 3, 'region': 'east', 'day': 3, 'revenue': 120 },
            { '_id': 4, 'region': 'west', 'day': 1, 'revenue': 200 },
            { '_id': 5, 'region': 'west', 'day': 2, 'revenue': 180 }
        ])

        result = list(sales.aggregate([
            {
                '$setWindowFields': {
                    'partitionBy': '$region',
                    'sortBy': { 'day': 1 },
                    'output': {
                        'runningRevenue': {
                            '$sum': '$revenue',
                            'window': { 'documents': ['unbounded', 'current'] }
                        }
                    }
                }
            }
        ]))

        print(result)
    finally:
        client.close()

example()
```

------