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