مشابه تجزیه و تحلیل گروهی SQL، MongoDB هم این قابلیت را پشتیبانی می‌کند. این بخش نحوه انجام تجزیه و تحلیل آماری داده‌های MongoDB با استفاده از Golang را معرفی می‌کند.

آموزش پیش‌نیاز

لطفاً آموزش پیش‌نیاز زیر را مطالعه کنید:

داده‌های آزمایشی

داده‌ها در مجموعه‌ی سفارشات به شکل زیر است:

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

گروه‌بندی و تجمع

استفاده از توابع گروه‌بندی و تجمع که از طریق متد Collection.Aggregate انجام می‌شود.

در زیر یک مثال از تجزیه و تحلیل آماری در MongoDB آمده است:

[
    { $match: { status: "A" } },  // مرحله اول، مطابقت داده‌های سند با معیارهای پرس‌وجو
    { $group: { _id: "$cust_id", total: { $sum: "$amount" } } },   // مرحله دوم، گروه‌بندی و تجمع
    { $sort: { total: -1 } }  // مرحله سوم، مرتب‌سازی نتایج
]

معادل SQL:

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

راه حل برای دستیابی به همان نتیجه در 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
	
	// کد برای اتصال به MongoDB و به‌دست‌آوردن اشیاء مجموعه اینجا حذف شده است و می‌توانید به آموزش شروع سریع مراجعه کنید.

	// عبارت تجزیه و تحلیل آماری، از ساختار داده‌ای Golang برای نمایش دستورالعمل اصلی MongoDB استفاده می‌کند.
	// اگر با مدل داده Golang MongoDB آشنا نیستید، لطفاً به بخش‌های قبلی مراجعه کنید.
	pipeline := mongo.Pipeline{
			{{"$match", bson.D{{"status", "A"}}}},
			{{"$group", bson.D{{"_id", "$cust_id"}, {"total", bson.D{{"$sum", "$amount"}}}}}},
			{{"$sort", bson.D{{"total", -1}}}
	}
	
	// تنظیم زمان محدود
	opts := options.Aggregate().SetMaxTime(2 * time.Second)
	
	// انجام تجزیه و تحلیل آماری
	cursor, err := coll.Aggregate(
								context.TODO(),  // پارامتر محیط
								pipeline,  // عبارت تجزیه و تحلیل آماری
								opts // پارامترهای اختیاری
							)
	if err != nil {
		log.Fatal(err)
	}

	// تعریف مجموعه نتایج، با استفاده از نوع bson.M (نوعی از ساختار map) برای ذخیره نتایج پرس‌وجو
	var results []bson.M
	// دریافت همه‌ی نتایج و ذخیره آن‌ها در متغیر نتایج
	if err = cursor.All(context.TODO(), &results); err != nil {
		log.Fatal(err)
	}
	
	// حلقه‌ی تکرار از روی نتایج پرس‌وجو
	for _, result := range results {
		fmt.Printf("id =  %v , total =  %v \n", result["_id"], result["total"])
	}
}

نکته: برای اطلاعات بیشتر درباره‌ی نحوه‌ی تجزیه و تحلیل MongoDB، لطفاً به لوله کشی تجمعی MongoDB مراجعه کنید.