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