مشابه تجزیه و تحلیل گروهی 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 مراجعه کنید.