Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
$TopN
Baru dari versi 8.0.1.
Gunakan $topN akumulator di $group tahap untuk mengembalikan N elemen teratas dalam grup sesuai dengan urutan pengurutan yang ditentukan. Jika grup berisi kurang dari N elemen, $topN mengembalikan semua elemen dalam grup.
Parameter
-
n: Bilangan bulat positif, atau ekspresi yang diselesaikan menjadi satu, menentukan berapa banyak hasil teratas yang akan dikembalikan per grup. -
sortBy: Dokumen yang menentukan urutan. Gunakan1untuk naik atau-1turun. -
output: Ekspresi yang menentukan bidang yang akan dikembalikan dari masing-masing dokumen N teratas.
Contoh (MongoDB Shell)
Contoh berikut menunjukkan cara menggunakan $topN akumulator untuk menemukan 2 penjualan teratas (jumlah tertinggi) per item dalam koleksi penjualan.
Buat dokumen sampel
db.sales.insertMany([ { item: "abc", quantity: 10, price: 5 }, { item: "abc", quantity: 7, price: 8 }, { item: "abc", quantity: 5, price: 10 }, { item: "xyz", quantity: 15, price: 3 }, { item: "xyz", quantity: 9, price: 6 }, { item: "xyz", quantity: 3, price: 12 } ])
Contoh kueri
db.sales.aggregate([ { $group: { _id: "$item", topTwoSales: { $topN: { n: 2, sortBy: { quantity: -1 }, output: { quantity: "$quantity", price: "$price" } } } } } ])
Keluaran
[
{ "_id": "xyz", "topTwoSales": [{ "quantity": 15, "price": 3 }, { "quantity": 9, "price": 6 }] },
{ "_id": "abc", "topTwoSales": [{ "quantity": 10, "price": 5 }, { "quantity": 7, "price": 8 }] }
]
Contoh penggunaan operator jendela (MongoDB Shell)
Baru dari versi 8.0.2.
$topNOperator juga dapat digunakan sebagai operator jendela di pang $setWindowFields gung. Dalam konteks ini, ia mengembalikan array output dari dokumen N teratas (sesuai dengan operator sendirisortBy) di antara dokumen di setiap jendela. Anda menentukan operator di bawah output bidang, dan secara opsional menentukan batas jendela dengan window dokumen.
catatan
Ketika digunakan sebagai operator jendela di$setWindowFields, $topN dibatasi hingga 100 MB data perantara. Operasi yang melebihi batas ini mengembalikan kesalahan.
Buat dokumen sampel
db.matchScores.insertMany([ { _id: 1, player: "Alice", round: 1, score: 20 }, { _id: 2, player: "Alice", round: 2, score: 35 }, { _id: 3, player: "Alice", round: 3, score: 28 }, { _id: 4, player: "Bob", round: 1, score: 15 }, { _id: 5, player: "Bob", round: 2, score: 40 } ]);
Contoh kueri
Contoh berikut mempartisi dokumen berdasarkanplayer, mengurutkan setiap partisi berdasarkanround, dan mengembalikan dua putaran skor tertinggi yang terlihat dari awal partisi melalui dokumen saat ini.
db.matchScores.aggregate([ { $setWindowFields: { partitionBy: "$player", sortBy: { round: 1 }, output: { topTwoRoundsSoFar: { $topN: { n: 2, sortBy: { score: -1 }, output: { round: "$round", score: "$score" } }, window: { documents: ["unbounded", "current"] } } } } } ]);
Keluaran
[
{ "_id": 1, "player": "Alice", "round": 1, "score": 20, "topTwoRoundsSoFar": [{ "round": 1, "score": 20 }] },
{ "_id": 2, "player": "Alice", "round": 2, "score": 35, "topTwoRoundsSoFar": [{ "round": 2, "score": 35 }, { "round": 1, "score": 20 }] },
{ "_id": 3, "player": "Alice", "round": 3, "score": 28, "topTwoRoundsSoFar": [{ "round": 2, "score": 35 }, { "round": 3, "score": 28 }] },
{ "_id": 4, "player": "Bob", "round": 1, "score": 15, "topTwoRoundsSoFar": [{ "round": 1, "score": 15 }] },
{ "_id": 5, "player": "Bob", "round": 2, "score": 40, "topTwoRoundsSoFar": [{ "round": 2, "score": 40 }, { "round": 1, "score": 15 }] }
]
Setiap dokumen ditambah dengantopTwoRoundsSoFar, dua putaran skor tertinggi dalam partisinya hingga dan termasuk dokumen saat ini. Jika jendela berisi kurang dari dua dokumen, semuanya dikembalikan.
Contoh kode
Untuk melihat contoh kode untuk menggunakan $topN operator, pilih tab untuk bahasa yang ingin Anda gunakan. Contoh berikut menunjukkan penggunaan akumulator (in$group) dan penggunaan operator jendela (in$setWindowFields):