Tương tự như phân tích Group theo SQL, MongoDB cũng hỗ trợ chức năng này. Chương này giới thiệu cách thực hiện phân tích thống kê dữ liệu MongoDB bằng Golang.

Hướng dẫn tiên quyết

Vui lòng đọc hướng dẫn tiên quyết dưới đây:

Dữ liệu Kiểm thử

Dữ liệu trong bộ sưu tập đơn hàng như sau:

{ _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 }

Nhóm và Tập trung

Thực hiện các truy vấn thống kê bằng cách sử dụng hàm Collection.Aggregate.

Dưới đây là một ví dụ về phân tích thống kê trong MongoDB:

[
    { $match: { status: "A" } },  // Bước đầu tiên, khớp dữ liệu tài liệu dựa trên tiêu chí truy vấn
    { $group: { _id: "$cust_id", total: { $sum: "$amount" } } },   // Bước thứ hai, nhóm và tập trung
    { $sort: { total: -1 } }  // Bước thứ ba, sắp xếp kết quả
]

Tương đương SQL:

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

Dưới đây là cách thực hiện tương tự trong 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
	
	// Mã kết nối MongoDB và lấy đối tượng bộ sưu tập bị bỏ qua ở đây và có thể tham khảo trong hướng dẫn khởi đầu nhanh.

	// Biểu thức phân tích thống kê, sử dụng cấu trúc dữ liệu Golang để biểu diễn cú pháp nguyên bản của MongoDB.
	// Nếu bạn không quen với mô hình dữ liệu MongoDB của Golang, vui lòng tham khảo phần trước đó.
	pipeline := mongo.Pipeline{
			{{"$match", bson.D{{"status", "A"}}}},
			{{"$group", bson.D{{"_id", "$cust_id"}, {"total", bson.D{{"$sum", "$amount"}}}}}},
			{{"$sort", bson.D{{"total", -1}}}
	}
	
	// Thiết lập thời gian chờ
	opts := options.Aggregate().SetMaxTime(2 * time.Second)
	
	// Thực hiện phân tích thống kê
	cursor, err := coll.Aggregate(
								context.TODO(),  // Tham số Ngữ cảnh
								pipeline,  // Biểu thức phân tích thống kê
								opts // Tham số tùy chọn
							)
	if err != nil {
		log.Fatal(err)
	}

	// Xác định tập kết quả, sử dụng loại bson.M (loại cấu trúc bản đồ) để lưu trữ kết quả truy vấn
	var results []bson.M
	// Lấy tất cả kết quả và lưu trữ chúng trong biến kết quả
	if err = cursor.All(context.TODO(), &results); err != nil {
		log.Fatal(err)
	}
	
	// Duyệt qua các kết quả truy vấn
	for _, result := range results {
		fmt.Printf("id =  %v , total =  %v \n", result["_id"], result["total"])
	}
}

Lời khuyên: Để biết thêm về cú pháp tập trung MongoDB, vui lòng tham khảo Ống nối Tập lệnh Tập trung MongoDB