เหมือนกับการวิเคราะห์แบบ SQL's Group by, MongoDB ก็สนับสนุนมันด้วยโดยมีวิธีการต่างๆ ในการกระทำวิเคราะห์สถิติของข้อมูล MongoDB โดยใช้ Golang.
บทช่วยการก่อนเรียน
โปรดอ่านบทช่วยการด้านล่าง:
ข้อมูลการทดสอบ
ข้อมูลในคอลเลคชัน orders มีดังนี้:
{ _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 และการได้รับอ็อบเจกต์คอลเล็กชันถูกละทิ้งไว้ที่นี่และสามารถอ้างอิงที่บทแนะนำเร็วๆนี้
// การแสดงความสถิติ, ใช้โครงสร้างข้อมูล MongoDB ใน Golang ในการแสดงออก
// หากคุณไม่คุ้นเคยกับโมเดลข้อมูล MongoDB ใน Golang โปรดอ้างอิงที่ส่วนก่อนหน้า
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(), // พารามิเตอร์ Context
pipeline, // การแสดงความสถิติ
opts // พารามิเตอร์ที่เลือกได้
)
if err != nil {
log.Fatal(err)
}
// กำหนดชุดผลลัพธ์, โดยใช้ประเภท bson.M (ประเภทโครงสร้างแผนที่) เพื่อเก็บผลลัพธ์การค้นหา
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 Aggregation Pipeline