Agregação
Visão geral
Neste guia, você pode aprender como usar as operações de agregação no Driver do MongoDB Go.
As operações de agregação processam dados em suas coleções MongoDB com base em suas especificações no pipeline de agregação. Um pipeline de agregação consiste em um ou mais estágios. Cada estágio executa uma operação com base em seus operadores de expressão. Depois que o acionador executa o pipeline de agregação, ele retorna um resultado agregado.
Analogia
As operações de agregação funcionam de forma semelhante a uma fábrica de automóveis. As fábricas de automóveis possuem uma linha de montagem. As linhas de montagem têm estações de montagem com ferramentas especializadas para executar uma tarefa específica. Para construir um carro, você envia peças brutas para a fábrica. Em seguida, a linha de montagem transforma e monta as peças num automóvel.
A linha de montagem se assemelha ao pipeline de agregação, as estações de montagem na linha de montagem se assemelham aos estágios de agregação, as ferramentas especializadas representam os operadores de expressão e o produto finalizado se assemelha ao resultado agregado.
Comparar operações
A tabela a seguir lista as tarefas que você pode executar com operações de localização e agregação.
Encontrar operações | Operações de agregação |
---|---|
Select what documents to return Select which fields to return Sort the results Limit the results Count the results | Select what documents to return Select which fields to return Sort the results Limit the results Count the results Rename fields Calculate fields Summarize data Group values |
Limitações
As operações de agregação têm limitações. Ao realizar operações de agregação, tenha em mente o seguinte:
Os documentos devolvidos não devem violar olimite de tamanho do documento BSON de 16 megabytes.
Os estágios do pipeline têm um limite de memória de 100 megabytes por padrão. Se necessário, você pode exceder esse limite com o método allowDiskUse.
O estágio $graphLookup tem um limite de memória rigoroso de 100 megabytes e ignora
allowDiskUse
.
Exemplos
Para executar os exemplos nesta seção, carregue os dados de amostra na coleção tea.menu
com o seguinte trecho:
coll := client.Database("tea").Collection("menu") docs := []interface{}{ bson.D{{"type", "Masala"}, {"category", "black"}, {"toppings", bson.A{"ginger", "pumpkin spice", "cinnomon"}}, {"price", 6.75}}, bson.D{{"type", "Gyokuro"}, {"category", "green"}, {"toppings", bson.A{"berries", "milk foam"}}, {"price", 5.65}}, bson.D{{"type", "English Breakfast"}, {"category", "black"}, {"toppings", bson.A{"whipped cream", "honey"}}, {"price", 5.75}}, bson.D{{"type", "Sencha"}, {"category", "green"}, {"toppings", bson.A{"lemon", "whipped cream"}}, {"price", 5.15}}, bson.D{{"type", "Assam"}, {"category", "black"}, {"toppings", bson.A{"milk foam", "honey", "berries"}}, {"price", 5.65}}, bson.D{{"type", "Matcha"}, {"category", "green"}, {"toppings", bson.A{"whipped cream", "honey"}}, {"price", 6.45}}, bson.D{{"type", "Earl Grey"}, {"category", "black"}, {"toppings", bson.A{"milk foam", "pumpkin spice"}}, {"price", 6.15}}, bson.D{{"type", "Hojicha"}, {"category", "green"}, {"toppings", bson.A{"lemon", "ginger", "milk foam"}}, {"price", 5.55}}, } result, err := coll.InsertMany(context.TODO(), docs) if err != nil { panic(err) }
Cada documento representa um chá no menu de uma loja. Ele contém informações sobre o tipo de chá, as coberturas que você pode adicionar e seu preço.
Classificação média
O exemplo a seguir calcula e exibe a classificação média e a quantidade de classificações para cada chá.
O pipeline de agregação usa o estágio $group
para agrupar os documentos pelo campo category
, calcular a média usando o operador de expressão $avg
e contar o número de documentos usando o operador de expressão $sum
.
// create the stage groupStage := bson.D{ {"$group", bson.D{ {"_id", "$category"}, {"average_price", bson.D{ {"$avg", "$price"}, }}, {"type_total", bson.D{ {"$sum", 1}, }}, }}} // pass the stage into a pipeline // pass the pipeline as the second paramter in the Aggregate() method cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{groupStage}) if err != nil { panic(err) } // display the results var results []bson.M if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { fmt.Printf("Average price of %v tea: $%v \n", result["_id"], result["average_price"]) fmt.Printf("Amount of %v tea: %v \n\n", result["_id"], result["type_total"]) }
Omitir campos nos resultados
O exemplo a seguir corresponde a documentos onde você pode obter espuma de leite como cobertura e lista as duas opções mais baratas.
O agregação pipeline contém os seguintes estágios:
$match
estágio para combinar com documentos onde seustoppings
contêm "espuma de leite"$unset
estágio para omitir os campos_id
ecategory
$sort
estágio para classificarprice
etoppings
em ordem crescente$limit
palco para mostrar os dois primeiros documentos
// create the stages matchStage := bson.D{{"$match", bson.D{{"toppings", "milk foam"}}}} unsetStage := bson.D{{"$unset", bson.A{"_id", "category"}}} sortStage := bson.D{{"$sort", bson.D{ {"price", 1}, {"toppings", 1}}, }} limitStage := bson.D{{"$limit", 2}} // pass the stage into a pipeline // pass the pipeline as the second paramter in the Aggregate() method cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{matchStage, unsetStage, sortStage, limitStage}) if err != nil { panic(err) } // display the results var results []bson.M if err = cursor.All(context.TODO(), &results); err != nil { panic(err) } for _, result := range results { fmt.Printf("Tea: %v \nToppings: %v \nPrice: $%v \n\n", result["type"], result["toppings"], result["price"]) }
Informações adicionais
Para saber mais sobre os termos mencionados, consulte os seguintes guias:
Para ver mais exemplos de agregação, consulte os seguintes guias:
Para saber mais sobre o método Aggregate()
e seu comportamento, consulte Recuperar dados.
Documentação da API
Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API: