Bab ini memperkenalkan penjelasan rinci tentang analisis statistik MongoDB, utamanya dicapai melalui Pipeline Agregasi. Ini mirip dengan pernyataan "group by" dalam SQL. Di shell MongoDB, analisis statistik diimplementasikan menggunakan fungsi db.collection.aggregate()
.
Tutorial Prasyarat
Langkah Umum
- Gunakan
$match
untuk menyaring data target - Gunakan
$group
untuk mengelompokkan dan menghitung data - Gunakan
$sort
untuk mengurutkan hasil (opsional)
Data Uji
Data dalam kumpulan orders
adalah sebagai berikut
{ _id: 1, cust_id: "abc1", ord_date: ISODate("2012-11-02T17:04:11.102Z"), status: "A", amount: 50 }
{ _id: 2, cust_id: "xyz1", ord_date: ISODate("2013-10-01T17:04:11.102Z"), status: "A", amount: 100 }
{ _id: 3, cust_id: "xyz1", ord_date: ISODate("2013-10-12T17:04:11.102Z"), status: "D", amount: 25 }
{ _id: 4, cust_id: "xyz1", ord_date: ISODate("2013-10-11T17:04:11.102Z"), status: "D", amount: 125 }
{ _id: 5, cust_id: "abc1", ord_date: ISODate("2013-11-12T17:04:11.102Z"), status: "A", amount: 25 }
Fungsi agregat
db.collection.aggregate(pipeline)
Penjelasan:
-
pipeline
mengambil parameter array, di mana setiap elemen mewakili tahap pemrosesan.
Contoh
db.orders.aggregate([
{ $match: { status: "A" } }, // Tahap pertama
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }, // Tahap kedua
{ $sort: { total: -1 } } // Tahap ketiga
])
Setara SQL
select sum(amount) as total from orders
where status="A"
group by cust_id
order by total desc
Tahap $match
Format:
{ $match: { <query> } }
Penjelasan:
-
<query>
Kondisi query MongoDB
Digunakan untuk menetapkan kondisi query. Jika $match
diabaikan, itu menyiratkan query semua data.
Tip: Jika Anda tidak terbiasa dengan sintaks query MongoDB, silakan merujuk ke bab sebelumnya.
Tahap $group
Mirip dengan klausa group by
dalam SQL, digunakan untuk mengelompokkan data dan kemudian melakukan serangkaian perhitungan statistik pada data yang dikelompokkan.
Penggunaan Dasar $group
Syntax:
{
$group:
{
_id: <expression>, // Kondisi pengelompokan, misalnya: kelompokkan berdasarkan bidang mana
<field1>: { <accumulator1> : <expression1> }, // Operasi agregasi, Anda dapat menambahkan N operasi agregasi
...
}
}
Penjelasan:
-
- Nama indikator statistik kustom, bisa N secara total -
- Fungsi agregasi, mirip dengan fungsi agregasi sum, avg dan fungsi agregasi lainnya dalam SQL, perbedaannya adalah fungsi agregasi MongoDB dinamai dengan $ sebagai awalan, misalnya: $sum, $avg -
- Parameter dari fungsi agregasi, biasanya nilai bidang yang akan dihitung, mengacu pada bidang dokumen menggunakan format "$nama_bidang"
Contoh:
db.orders.aggregate([
{
$group: {
_id: "$cust_id",
total: { $sum: "$amount" }, // Menambahkan indikator pertama yang dihitung total, menggunakan operator penjumlahan $sum
amount_avg: {$avg: "$amount"} // Menambahkan indikator kedua yang dihitung avg, menggunakan operator perhitungan rata-rata $avg
}
}
])
Keluaran:
{ "_id" : "abc1", "total" : 75, "amount_avg" : 37.5 }
{ "_id" : "xyz1", "total" : 250, "amount_avg" : 83.33333333333333 }
Setara SQL:
select
sum(amount) as total,
avg(amount) as amount_avg
from orders
group by cust_id
Fungsi Agregasi $group
Fungsi agregasi yang umum digunakan untuk $group adalah sebagai berikut:
Operator | Deskripsi | Contoh |
---|---|---|
$avg | Menghitung rata-rata | {$avg: "$amount"} |
$sum | Penjumlahan | {$sum: "$amount"} |
$max | Nilai maksimum | {$max: "$amount"} |
$min | Nilai minimum | {$min: "$amount"} |
$first | Mengembalikan data setelah pengelompokan, konten dokumen pertama | {$first: "$amount"} |
$last | Mengembalikan data setelah pengelompokan, konten dokumen terakhir | {$last: "$amount"} |
$push | Mengembalikan data setelah pengelompokan | { $push: { ord_date: "$ord_date", amount: "$amount" } |
$addToSet | Mengembalikan data setelah pengelompokan, berbeda dari $push karena menghapus duplikat | { $addToSet: "$amount" } |
Contoh $push
db.orders.aggregate(
[
{
$group:
{
_id: "$cust_id",
all: { $push: { ord_date: "$ord_date", amount: "$amount" } } // Nilai dari bidang ord_date dan amount
}
}
]
)
Keluaran
{ "_id" : "abc1", "all" : [ { "ord_date" : "2021-04-18 00:00:00", "amount" : 50 }, { "ord_date" : "2021-04-21 00:00:00", "amount" : 25 } ] }
{ "_id" : "xyz1", "all" : [ { "ord_date" : "2021-04-18 00:00:00", "amount" : 100 }, { "ord_date" : "2021-04-20 00:00:00", "amount" : 25 }, { "ord_date" : "2021-04-21 00:00:00", "amount" : 125 } ] }
Contoh $addToSet
db.orders.aggregate(
[
{
$group:
{
_id: "$cust_id",
all_amount: { $addToSet: "$amount" } // Mengembalikan semua nilai jumlah yang berbeda
}
}
]
)
Keluaran
{ "_id" : "abc1", "all_amount" : [ 25, 50 ] }
{ "_id" : "xyz1", "all_amount" : [ 100, 25, 125 ] }
$sort:
Tahap $sort biasanya ditempatkan di akhir untuk mengurutkan data yang telah teragregasi.
Format:
{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }
Penjelasan:
-
, - Nama-nama bidang yang akan diurutkan, mendukung beberapa bidang. -
- Arah pengurutan, -1 untuk menurun, 1 untuk naik.
Contoh:
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } }
])
Penomoran Agregat
Kita dapat menerapkan penomoran menggunakan operator $limit dan $skip.
Contoh:
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } },
{ $limit: 5 }, // Batasi jumlah catatan yang dikembalikan, mirip dengan ukuran halaman dalam penomoran.
{ $skip: 1 } // Lewati sejumlah catatan, mirip dengan offset dalam SQL.
])