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