Similarmente à análise de Grupo por do SQL, o MongoDB também a suporta. Este capítulo introduz como implementar análise estatística de dados do MongoDB usando Golang.

Tutorial Pré-requisito

Por favor, leia o tutorial pré-requisito abaixo:

Dados de Teste

Os dados na coleção de pedidos são os seguintes:

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

Agrupamento e Agregação

Realize consultas estatísticas usando a função Collection.Aggregate.

Abaixo está um exemplo de análise estatística no MongoDB:

[
    { $match: { status: "A" } },  // A primeira etapa, combinando dados do documento com base em critérios de consulta
    { $group: { _id: "$cust_id", total: { $sum: "$amount" } } },   // A segunda etapa, agrupamento e agregação
    { $sort: { total: -1 } }  // A terceira etapa, ordenando os resultados
]

Equivalente SQL:

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

Aqui está como alcançar o mesmo em 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

	// O código para conectar ao MongoDB e obter objetos de coleção é omitido aqui e pode ser consultado no tutorial de início rápido.

	// Expressão de análise estatística, usando a estrutura de dados Golang para representar a sintaxe nativa do MongoDB.
	// Se não estiver familiarizado com o modelo de dados do MongoDB em Golang, consulte as seções anteriores.
	pipeline := mongo.Pipeline{
			{{"$match", bson.D{{"status", "A"}}}},
			{{"$group", bson.D{{"_id", "$cust_id"}, {"total", bson.D{{"$sum", "$amount"}}}}}},
			{{"$sort", bson.D{{"total", -1}}}
	}

	// Definir tempo limite
	opts := options.Aggregate().SetMaxTime(2 * time.Second)

	// Realizar análise estatística
	cursor, err := coll.Aggregate(
								context.TODO(),  // Parâmetro Context
								pipeline,  // Expressão de análise estatística
								opts // Parâmetros opcionais
							)
	if err != nil {
		log.Fatal(err)
	}

	// Definir o conjunto de resultados, usando o tipo bson.M (um tipo de estrutura de mapa) para armazenar os resultados da consulta.
	var results []bson.M
	// Obter todos os resultados e armazená-los na variável de resultados
	if err = cursor.All(context.TODO(), &results); err != nil {
		log.Fatal(err)
	}

	// Iterar através dos resultados da consulta
	for _, result := range results {
		fmt.Printf("id =  %v , total =  %v \n", result["_id"], result["total"])
	}
}

Dica: Para mais sintaxe de agregação do MongoDB, consulte Pipeline de Agregação do MongoDB