Menu Docs

Página inicial do DocsGo

Agregação

Nesta página

  • Visão geral
  • Comparar operações
  • Limitações
  • Exemplos
  • Informações adicionais

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.

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.

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

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.

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.

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"])
}

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 seus toppings contêm "espuma de leite"

  • $unset estágio para omitir os campos _id e category

  • $sort estágio para classificar price e toppings 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"])
}

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.

Para saber mais sobre qualquer um dos métodos ou tipos discutidos neste guia, consulte a seguinte documentação da API:

←  Modificar execução de operações CRUDIndexes →
Dê Feedback
© 2022 MongoDB, Inc.

Sobre

© 2022 MongoDB, Inc.