Simile all'analisi Group by di SQL, MongoDB la supporta. Questo capitolo introduce come implementare l'analisi statistica dei dati di MongoDB utilizzando Golang.

Tutorial Prerequisito

Si prega di leggere il tutorial prerequisito qui sotto:

Dati di test

I dati nella collezione degli ordini sono i seguenti:

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

Raggruppamento e Aggregazione

Eseguire query statistiche utilizzando la funzione Collection.Aggregate.

Di seguito è riportato un esempio di analisi statistica in MongoDB:

[
    { $match: { status: "A" } },  // Il primo stadio, abbinamento dei documenti in base ai criteri di query
    { $group: { _id: "$cust_id", total: { $sum: "$amount" } } },   // Il secondo stadio, raggruppamento e aggregazione
    { $sort: { total: -1 } }  // Il terzo stadio, ordinamento dei risultati
]

SQL equivalente:

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

Ecco come ottenere lo stesso risultato in Golang:

pacchetto principale

import (
	contexto
	"fmt"
	"log"
	tempo

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
)

func principale() {
	var coll *mongo.Collection
	
	// Il codice per la connessione a MongoDB e l'ottenimento degli oggetti della collezione è omesso qui e può essere consultato nel tutorial di avvio rapido.

	// Espressione di analisi statistica, utilizzando la struttura dati di Golang per rappresentare la sintassi nativa di MongoDB.
	// Se non si è familiari con il modello di dati di MongoDB di Golang, fare riferimento alle sezioni precedenti.
	pipeline := mongo.Pipeline{
			{{"$match", bson.D{{"status", "A"}}}},
			{{"$group", bson.D{{"_id", "$cust_id"}, {"total", bson.D{{"$sum", "$amount"}}}}}},
			{{"$sort", bson.D{{"total", -1}}}
	}
	
	// Imposta il timeout
	opts := options.Aggregate().SetMaxTime(2 * tempo.Secondo)
	
	// Esegui analisi statistica
	cursor, err := coll.Aggregate(
								context.TODO(),  // Parametro di contesto
								pipeline,  // Espressione di analisi statistica
								opts // Parametri opzionali
							)
	if err != nil {
		log.Fatal(err)
	}

	// Definisci l'insieme di risultati, utilizzando il tipo bson.M (un tipo di struttura mappa) per memorizzare i risultati della query
	var results []bson.M
	// Ottieni tutti i risultati e memorizzali nella variabile dei risultati
	if err = cursor.All(context.TODO(), &results); err != nil {
		log.Fatal(err)
	}
	
	// Itera attraverso i risultati della query
	per _, risultato := range risultati {
		fmt.Printf("id =  %v , totale =  %v \n", risultato["_id"], risultato["total"])
	}
}

Suggerimento: Per ulteriori sintassi di aggregazione di MongoDB, fare riferimento a Pipeline di aggregazione di MongoDB