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