Sama seperti analisis Group by di SQL, MongoDB juga mendukungnya. Bab ini memperkenalkan bagaimana cara mengimplementasikan analisis statistik data MongoDB menggunakan Golang.

Tutorial Prasyarat

Silakan baca tutorial prasyarat di bawah ini:

Data Uji

Data dalam koleksi pesanan 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 }

Pengelompokan dan Agregasi

Lakukan kueri statistik menggunakan fungsi Collection.Aggregate.

Berikut adalah contoh analisis statistik di MongoDB:

[
    { $match: { status: "A" } },  // Tahap pertama, mencocokkan data dokumen berdasarkan kriteria kueri
    { $group: { _id: "$cust_id", total: { $sum: "$amount" } } },   // Tahap kedua, pengelompokan dan agregasi
    { $sort: { total: -1 } }  // Tahap ketiga, menyortir hasil
]

Setara dengan SQL:

select sum(amount) as total from orders 
        where status="A" 
        group by cust_id 
        order by total desc

Berikut cara mencapai hal yang sama di Golang:

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
	var coll *mongo.Collection
	
	// Kode untuk menghubungkan ke MongoDB dan mendapatkan objek koleksi dihapus di sini dan dapat dirujuk dalam tutorial memulai cepat.

	// Ekspresi analisis statistik, menggunakan struktur data Golang untuk mewakili sintaks asli MongoDB.
	// Jika Anda tidak terbiasa dengan model data MongoDB Golang, silakan merujuk ke bagian sebelumnya.
	pipeline := mongo.Pipeline{
			{{"$match", bson.D{{"status", "A"}}}},
			{{"$group", bson.D{{"_id", "$cust_id"}, {"total", bson.D{{"$sum", "$amount"}}}}}},
			{{"$sort", bson.D{{"total", -1}}}
	}
	
	// Atur waktu habis
	opts := options.Aggregate().SetMaxTime(2 * time.Second)
	
	// Lakukan analisis statistik
	cursor, err := coll.Aggregate(
								context.TODO(),  // Parameter Konteks
								pipeline,  // Ekspresi analisis statistik
								opts // Parameter opsional
							)
	if err != nil {
		log.Fatal(err)
	}

	// Tentukan himpunan hasil, menggunakan tipe bson.M (tipe struktur peta) untuk menyimpan hasil kueri
	var results []bson.M
	// Dapatkan semua hasil dan simpan dalam variabel hasil
	if err = cursor.All(context.TODO(), &results); err != nil {
		log.Fatal(err)
	}
	
	// Telusuri hasil kueri
	for _, result := range results {
		fmt.Printf("id =  %v , total =  %v \n", result["_id"], result["total"])
	}
}

Tip: Untuk sintaksis agregasi MongoDB lebih lanjut, silakan merujuk ke MongoDB Aggregation Pipeline