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

Pipeline Agregasi MongoDB

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.
                   ])