Menu Docs
Página inicial do Docs
/ / /
PyMongo
/ /

Grupo e total

Nesta página

  • Introdução
  • Resumo da tarefa de agregação
  • Antes de começar
  • Tutorial
  • Adicione um estágio de correspondência para pedidos em 2020
  • Adicione um estágio de classificação para classificar por data do pedido
  • Adicione um estágio de grupo para agrupar por endereço de e-mail
  • Adicione um estágio de classificação para classificar por data do primeiro pedido
  • Adicione um estágio de conjunto para exibir o endereço de e-mail
  • Adicione um estágio não definido para remover campos desnecessários
  • Executar o pipeline de agregação
  • Interpretar resultados

Neste tutorial, você pode aprender como usar o PyMongo para construir um pipeline de agregação, executar a agregação em uma coleção e imprimir os resultados concluindo e executando um aplicativo de exemplo. Essa agregação executa as seguintes operações:

  • Corresponde a um subconjunto de documentos pelo valor de um campo

  • Agrupa documentos por valores de campo comuns

  • Adiciona campos calculados a cada documento de resultado

Este tutorial demonstra como agrupar e analisar dados de pedido de cliente. Os resultados mostram a lista de clientes que compraram itens em 2020 e incluem o histórico de pedidos de cada cliente para 2020.

Este exemplo utiliza uma collection, orders, que contém documento que descrevem pedidos de produtos individuais. Como cada pedido pode corresponder a apenas um cliente, os documentos do pedido são agrupados pelo campo customer_id , que contém os endereços de e-mail do cliente.

Antes de iniciar este tutorial, conclua as instruções do Aplicativo modelo de agregação para configurar um aplicativo Python funcional.

Depois de configurar o aplicativo, acesse a coleção orders adicionando o seguinte código ao aplicativo:

orders_coll = agg_db["orders"]

Exclua quaisquer dados existentes e insira dados de amostra na coleção orders como mostrado no seguinte código:

orders_coll.delete_many({})
order_data = [
{
"customer_id": "elise_smith@myemail.com",
"orderdate": datetime(2020, 5, 30, 8, 35, 52),
"value": 231
},
{
"customer_id": "elise_smith@myemail.com",
"orderdate": datetime(2020, 1, 13, 9, 32, 7),
"value": 99
},
{
"customer_id": "oranieri@warmmail.com",
"orderdate": datetime(2020, 1, 1, 8, 25, 37),
"value": 63
},
{
"customer_id": "tj@wheresmyemail.com",
"orderdate": datetime(2019, 5, 28, 19, 13, 32),
"value": 2
},
{
"customer_id": "tj@wheresmyemail.com",
"orderdate": datetime(2020, 11, 23, 22, 56, 53),
"value": 187
},
{
"customer_id": "tj@wheresmyemail.com",
"orderdate": datetime(2020, 8, 18, 23, 4, 48),
"value": 4
},
{
"customer_id": "elise_smith@myemail.com",
"orderdate": datetime(2020, 12, 26, 8, 55, 46),
"value": 4
},
{
"customer_id": "tj@wheresmyemail.com",
"orderdate": datetime(2021, 2, 28, 7, 49, 32),
"value": 1024
},
{
"customer_id": "elise_smith@myemail.com",
"orderdate": datetime(2020, 10, 3, 13, 49, 44),
"value": 102
}
]
orders_coll.insert_many(order_data)
1

Primeiro, adicione um estágio $match que corresponda aos pedidos feitos em 2020:

pipeline.append({
"$match": {
"orderdate": {
"$gte": datetime(2020, 1, 1, 0, 0, 0),
"$lt": datetime(2021, 1, 1, 0, 0, 0)
}
}
})
2

Em seguida, adicione um estágio $sort para definir uma classificação ascendente no campo orderdate para exibir a primeira compra 2020 para cada cliente no próximo estágio:

pipeline.append({
"$sort": {
"orderdate": 1
}
})
3

Adicione um estágio $group para agrupar pedidos pelo valor do campo customer_id . Nesta etapa, adicione operações de agregação que criam os seguintes campos nos documentos de resultado:

  • first_purchase_date: a data da primeira compra do cliente

  • total_value: o valor total de todas as compras do cliente

  • total_orders: o número total de compras do cliente

  • orders: a lista de todas as compras do cliente, incluindo a data e o valor de cada compra

pipeline.append({
"$group": {
"_id": "$customer_id",
"first_purchase_date": {"$first": "$orderdate"},
"total_value": {"$sum": "$value"},
"total_orders": {"$sum": 1},
"orders": {"$push": {"orderdate": "$orderdate", "value": "$value"}}
}
})
4

Em seguida, adicione outro estágio $sort para definir uma classificação ascendente no campo first_purchase_date :

pipeline.append({
"$sort": {
"first_purchase_date": 1
}
})
5

Adicione um estágio $set para recriar o campo customer_id a partir dos valores no campo _id que foram definidos durante o estágio $group :

pipeline.append({
"$set": {
"customer_id": "$_id"
}
})
6

Finalmente, adicione um estágio $unset . O estágio $unset remove o campo _id dos documentos de resultado:

pipeline.append({"$unset": ["_id"]})
7

Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection orders :

aggregation_result = orders_coll.aggregate(pipeline)

Por fim, execute o seguinte comando em seu shell para iniciar seu aplicativo:

python3 agg_tutorial.py
8

A agregação retorna o seguinte resumo dos pedidos dos clientes de 2020:

{
'first_purchase_date': datetime.datetime(2020, 1, 1, 8, 25, 37),
'total_value': 63,
'total_orders': 1,
'orders': [ { 'orderdate': datetime.datetime(2020, 1, 1, 8, 25, 37), 'value': 63 } ],
'customer_id': 'oranieri@warmmail.com'
}
{
'first_purchase_date': datetime.datetime(2020, 1, 13, 9, 32, 7),
'total_value': 436,
'total_orders': 4,
'orders': [
{ 'orderdate': datetime.datetime(2020, 1, 13, 9, 32, 7), 'value': 99 },
{ 'orderdate': datetime.datetime(2020, 5, 30, 8, 35, 52), 'value': 231 },
{ 'orderdate': datetime.datetime(2020, 10, 3, 13, 49, 44), 'value': 102 },
{ 'orderdate': datetime.datetime(2020, 12, 26, 8, 55, 46), 'value': 4 }
],
'customer_id': 'elise_smith@myemail.com'
}
{
'first_purchase_date': datetime.datetime(2020, 8, 18, 23, 4, 48),
'total_value': 191,
'total_orders': 2,
'orders': [
{ 'orderdate': datetime.datetime(2020, 8, 18, 23, 4, 48), 'value': 4 },
{ 'orderdate': datetime.datetime(2020, 11, 23, 22, 56, 53), 'value': 187 }
],
'customer_id': 'tj@wheresmyemail.com'
}

Os documentos de resultados contêm detalhes de todos os pedidos de um determinado cliente, agrupados pelo endereço de e-mail do cliente.

Para visualizar o código completo deste tutorial, consulte o Aplicativo Concluído e Total no Github.

Voltar

Subconjunto filtrado

Próximo

Descompactar arrays e grupo