View a markdown version of this page

$ set WindowFields - Amazon DocumentDB

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

$ set WindowFields

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

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 atau2), 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 adalahdocuments: ["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

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

$randOperator 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 mengembalikan0;$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)

Contoh berikut mempartisi dokumen berdasarkanregion, mengurutkan setiap partisi berdasarkanday, 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 denganrunningRevenue, jumlah kumulatif dari revenue dalam partisinya hingga dan termasuk dokumen saat ini.

Contoh kode

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