Página inicial do Docs → Desenvolver aplicações → Drivers Python → 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
Introdução
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
Resumo da tarefa de agregação
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 começar
Antes de iniciar este tutorial, conclua as instruções do Aplicativo modelo de agregação para configurar um aplicação 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)
Tutorial
Adicione um estágio de correspondência para pedidos em 2020
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) } } })
Adicione um estágio de classificação para classificar por data do pedido
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 } })
Adicione um estágio de grupo para agrupar por endereço de e-mail
Adicione um estágio $group para agrupar os 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 clientetotal_value
: o valor total de todas as compras do clientetotal_orders
: o número total de compras do clienteorders
: 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"}} } })
Adicione um estágio de classificação para classificar por data do primeiro pedido
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 } })
Adicione um estágio de conjunto para exibir o endereço de e-mail
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" } })
Adicione um estágio não definido para remover campos desnecessários
Finalmente, adicione um estágio $unset . O estágio $unset
remove o campo _id
dos documentos de resultado:
pipeline.append({"$unset": ["_id"]})
Interpretar resultados
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.