$sum, $avg, $min, $max: Agregasi Berangka
Pelajar akan mengira jumlah, purata dan nilai ekstrem dalam $group serta menggunakan pengagregat ini sebagai operator ungkapan dalam $project.
$sum, $avg, $min, $max: Agregasi Berangka ialah pelajaran MongoDB Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran MongoDB Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus MongoDB Academy merangkumi sejumlah 4 pelajaran.
Pengumpul Berangka dalam $group
Peringkat $group MongoDB menggunakan pengumpul untuk mengira nilai agregat daripada dokumen yang dikumpulkan. Pengumpul berangka paling asas ialah $sum, $avg, $min dan $max. Setiap pengumpul memproses semua dokumen dalam satu kumpulan dan menghasilkan satu nilai output. Operator ini menjadi asas kepada saluran paip analitik.
Menggunakan $sum untuk Mengira dan Menjumlahkan
Pengumpul $sum mempunyai dua kegunaan biasa: mengira dokumen dengan menghantar nilai literal seperti 1, dan menjumlahkan medan dengan merujuk medan berangka. Apabila medan tiada atau bernilai null, $sum menganggapnya sebagai sifar. Ini menjadikannya selamat digunakan pada medan berangka pilihan tanpa semakan null tambahan.
db.orders.aggregate([
{
$group: {
_id: '$status',
orderCount: { $sum: 1 },
totalRevenue: { $sum: '$amount' }
}
}
])Mengira Purata Dengan $avg
Pengumpul $avg mengira min aritmetik bagi medan berangka merentas semua dokumen dalam satu kumpulan. Ia mengabaikan dokumen yang medannya tiada atau bernilai null secara automatik, lalu mengira purata hanya berdasarkan nilai yang sah. Ini berguna untuk metrik seperti nilai pesanan purata atau penilaian purata bagi setiap produk.
db.reviews.aggregate([
{
$group: {
_id: '$productId',
averageRating: { $avg: '$rating' },
reviewCount: { $sum: 1 }
}
},
{ $sort: { averageRating: -1 } }
])Mencari Nilai Ekstrem Dengan $min dan $max
$min dan $max masing-masing mengembalikan nilai terkecil dan terbesar dalam satu kumpulan. Ia berfungsi pada sebarang jenis yang boleh dibandingkan—nombor, tarikh dan rentetan. Kes penggunaan biasa ialah mencari masa acara pertama dan terakhir dalam satu sesi, atau produk paling murah dan paling mahal dalam satu kategori. Kedua-duanya mengabaikan nilai null dan nilai yang tiada.
db.sessions.aggregate([
{
$group: {
_id: '$userId',
firstLogin: { $min: '$timestamp' },
lastLogin: { $max: '$timestamp' },
minSessionDuration: { $min: '$durationSeconds' },
maxSessionDuration: { $max: '$durationSeconds' }
}
}
])Mengumpulkan Mengikut Null untuk Jumlah Keseluruhan
Untuk mengira satu agregat bagi seluruh koleksi, tetapkan _id kepada null. Ini mengumpulkan semua dokumen ke dalam satu kelompok. Teknik ini membolehkan anda mengira jumlah, purata keseluruhan dan nilai ekstrem global tanpa membahagikan data kepada segmen. Anggap ia sebagai padanan MongoDB bagi SQL SELECT SUM(*) FROM orders tanpa klausa GROUP BY.
db.orders.aggregate([
{
$group: {
_id: null,
totalOrders: { $sum: 1 },
grandTotal: { $sum: '$amount' },
averageOrder: { $avg: '$amount' },
minOrder: { $min: '$amount' },
maxOrder: { $max: '$amount' }
}
}
])Menggunakan Pengumpul Ini dalam $project
Ciri yang kurang diketahui ialah $sum, $avg, $min dan $max juga boleh digunakan sebagai operator ungkapan dalam $project—bukan hanya dalam $group. Dalam konteks ini, operator tersebut beroperasi pada tatasusunan dalam satu dokumen, bukannya merentas berbilang dokumen. Ini membolehkan anda mengira jumlah elemen dalam medan tatasusunan terbenam tanpa peringkat $group.
db.carts.aggregate([
{
$project: {
userId: 1,
// Sum elements inside the items array
cartTotal: { $sum: '$items.price' },
maxItemPrice: { $max: '$items.price' },
avgItemPrice: { $avg: '$items.price' }
}
}
])Ungkapan Bersarang dalam Pengumpul
Pengumpul menerima sebarang ungkapan yang sah, bukan sekadar rujukan medan. Anda boleh menggunakan operator aritmetik, ungkapan bersyarat dan juga $cond dalam pengumpul. Ini membolehkan anda melaksanakan jumlah bersyarat seperti 'jumlahkan pesanan yang selesai sahaja' atau 'kira transaksi bernilai tinggi sahaja' dalam satu peringkat saluran paip.
db.orders.aggregate([
{
$group: {
_id: '$customerId',
// Only sum orders that are 'completed'
completedRevenue: {
$sum: {
$cond: [
{ $eq: ['$status', 'completed'] },
'$amount',
0
]
}
}
}
}
])Saluran Paip Pengumpulan Berbilang Tahap
Anda boleh merangkaikan berbilang peringkat $group untuk mengira pengagregatan berbilang tahap. Kumpulan pertama mengira jumlah harian, manakala kumpulan kedua mengira purata bulanan daripada jumlah harian tersebut. Corak ini lebih kemas berbanding melakukan semuanya dalam satu peringkat dan memudahkan logik saluran paip difahami.
db.sales.aggregate([
// First group: totals per day
{
$group: {
_id: { year: { $year: '$date' }, month: { $month: '$date' }, day: { $dayOfMonth: '$date' } },
dailyTotal: { $sum: '$amount' }
}
},
// Second group: average daily total per month
{
$group: {
_id: { year: '$_id.year', month: '$_id.month' },
avgDailyRevenue: { $avg: '$dailyTotal' },
totalMonthRevenue: { $sum: '$dailyTotal' }
}
}
])Menapis Sebelum Mengumpulkan Dengan $match
Sentiasa letakkan peringkat $match sebelum $group untuk menapis dokumen yang berkaitan terlebih dahulu. Ini mengurangkan bilangan dokumen yang perlu diproses oleh peringkat pengumpulan dan, yang penting, membolehkan MongoDB menggunakan indeks untuk memenuhi penapis tersebut. $match selepas $group menapis hasil kumpulan, yang juga berguna tetapi tidak mendapat manfaat daripada indeks.
db.orders.aggregate([
// Filter first — MongoDB can use an index on createdAt
{
$match: {
createdAt: { $gte: new Date('2024-01-01') },
status: 'completed'
}
},
{
$group: {
_id: '$region',
totalRevenue: { $sum: '$amount' },
avgRevenue: { $avg: '$amount' }
}
},
{ $sort: { totalRevenue: -1 } }
])Mengendalikan Nilai yang Tiada dan Null
Apabila medan yang dirujuk dalam $sum atau $avg tiada atau bernilai null, tingkah lakunya sedikit berbeza. $sum menganggap nilai tiada/null sebagai sifar, jadi semua dokumen menyumbang kepada kiraan. $avg serta $min/$max mengabaikan nilai tiada/null sepenuhnya—nilai tersebut tidak diambil kira dalam pengiraan. Memahami perbezaan ini dapat mengelakkan pepijat tersembunyi dalam pertanyaan analitik anda.
// Consider documents where some lack a 'discount' field
// $sum: missing = 0, so it counts in the total
// $avg: missing fields are ignored, avg is over existing values only
db.orders.aggregate([
{
$group: {
_id: '$category',
totalDiscount: { $sum: '$discount' }, // missing = 0
avgDiscount: { $avg: '$discount' } // missing = ignored
}
}
])Contoh Praktikal: Papan Pemuka Jualan
Menggabungkan $sum, $avg, $min dan $max dalam satu peringkat $group ialah corak biasa untuk metrik papan pemuka. Satu saluran paip pengagregatan boleh mengembalikan semua yang diperlukan untuk mengisi kad ringkasan: jumlah pesanan, hasil, nilai pesanan purata dan julat saiz pesanan. Ini mengelakkan perjalanan pergi balik berbilang kali ke pangkalan data.
db.orders.aggregate([
{ $match: { status: 'completed' } },
{
$group: {
_id: '$category',
totalOrders: { $sum: 1 },
totalRevenue: { $sum: '$amount' },
avgOrderValue: { $avg: '$amount' },
smallestOrder: { $min: '$amount' },
largestOrder: { $max: '$amount' }
}
},
{ $sort: { totalRevenue: -1 } },
{ $limit: 10 }
])Semakan Pantas
Uji pemahaman anda tentang konsep MongoDB dan pangkalan data NoSQL daripada pelajaran ini.
Rumusan Pelajaran
Dalam pelajaran ini, anda mempelajari bahawa: $sum menjumlahkan nilai dan mengira dokumen (nilai tiada = 0), $avg/$min/$max mengabaikan medan yang tiada atau null, dan pengumpul ini berfungsi dalam kedua-dua $group (merentas dokumen) dan $project (dalam tatasusunan). Seterusnya kita akan meneroka $push dan $addToSet untuk membina tatasusunan dalam kumpulan.
Pelajari JavaScript dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “$sum, $avg, $min, $max: Agregasi Berangka” percuma?
Ya — teks penuh “$sum, $avg, $min, $max: Agregasi Berangka” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus MongoDB Academy, tingkat taraf kepada CoddyKit PRO. Kursus MongoDB Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “$sum, $avg, $min, $max: Agregasi Berangka”?
Pelajar akan mengira jumlah, purata dan nilai ekstrem dalam $group serta menggunakan pengagregat ini sebagai operator ungkapan dalam $project. Anda berlatih MongoDB Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan MongoDB Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran MongoDB Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “$sum, $avg, $min, $max: Agregasi Berangka” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran MongoDB Academy ini?
Ya. Setiap pelajaran MongoDB Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- $sum, $avg, $min, $max: Agregasi Berangka
- $push dan $addToSet: Membina Tatasusunan dalam Kumpulan
- Pengagregat $first, $last dan $top/$bottom
- Fungsi Tetingkap Dengan $setWindowFields