De manière similaire à l'analyse Group by de SQL, MongoDB le prend également en charge. Ce chapitre présente comment implémenter une analyse statistique des données MongoDB en utilisant Golang.
Tutoriel préalable
Veuillez lire le tutoriel préalable ci-dessous:
Données de test
Les données dans la collection des commandes sont les suivantes:
{ _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 }
Regroupement et Agrégation
Effectuez des requêtes statistiques en utilisant la fonction Collection.Aggregate.
Voici un exemple d'analyse statistique dans MongoDB:
[
{ $match: { status: "A" } }, // La première étape, correspondance des données de document en fonction des critères de requête
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }, // La deuxième étape, regroupement et agrégation
{ $sort: { total: -1 } } // La troisième étape, tri des résultats
]
Équivalent SQL:
select sum(amount) as total from orders
where status="A"
group by cust_id
order by total desc
Voici comment réaliser la même chose en 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
// Le code de connexion à MongoDB et l'obtention d'objets de collection est omis ici et peut être consulté dans le tutoriel de démarrage rapide.
// Expression d'analyse statistique, en utilisant la structure de données Golang pour représenter la syntaxe native de MongoDB.
// Si vous n'êtes pas familier avec le modèle de données Golang MongoDB, veuillez vous référer aux sections précédentes.
pipeline := mongo.Pipeline{
{{"$match", bson.D{{"status", "A"}}}},
{{"$group", bson.D{{"_id", "$cust_id"}, {"total", bson.D{{"$sum", "$amount"}}}}}},
{{"$sort", bson.D{{"total", -1}}}
}
// Définir le délai d'attente
opts := options.Aggregate().SetMaxTime(2 * time.Second)
// Effectuer une analyse statistique
cursor, err := coll.Aggregate(
context.TODO(), // Paramètre contexte
pipeline, // Expression d'analyse statistique
opts // Paramètres optionnels
)
if err != nil {
log.Fatal(err)
}
// Définir l'ensemble de résultats, en utilisant le type bson.M (un type de structure de carte) pour stocker les résultats de la requête
var results []bson.M
// Obtenir tous les résultats et les stocker dans la variable de résultats
if err = cursor.All(context.TODO(), &results); err != nil {
log.Fatal(err)
}
// Parcourir les résultats de la requête
for _, result := range results {
fmt.Printf("id = %v , total = %v \n", result["_id"], result["total"])
}
}
Astuce : Pour plus de syntaxe d'agrégation MongoDB, veuillez vous référer à Pipeline d'agrégation MongoDB