Menu Docs

Grupo e total

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 coleção, orders, que contém documentos 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 a seguir um tutorial de agregação, você deve configurar um novo aplicativo Python. Você pode usar esse aplicativo para se conectar a um sistema do MongoDB, inserir dados de amostra no MongoDB e executar o aggregation pipeline em cada tutorial.

Dica

Para saber como instalar o driver e se conectar ao MongoDB, consulte Introdução ao PyMongo

Após instalar o driver, crie um arquivo chamado agg_tutorial.py. Cole o seguinte código neste arquivo para criar um modelo de aplicativo para os tutoriais de agregação:

from pymongo import MongoClient
# Replace the placeholder with your connection string.
uri = "<connection string>"
client = MongoClient(uri)
try:
agg_db = client["agg_tutorials_db"]
# Get a reference to relevant collections.
# ... some_coll =
# ... another_coll =
# Delete any existing documents in collections.
# ... some_coll.delete_many({})
# Insert sample data into the collection or collections.
# ... some_data = [...]
# ... some_coll.insert_many(some_data)
# Create an empty pipeline array.
pipeline = []
# Add code to create pipeline stages.
# ... pipeline.append({...})
# Run the aggregation.
# ... aggregation_result = ...
# Print the aggregation results.
for document in aggregation_result:
print(document)
finally:
client.close()

Importante

No código anterior, leia os comentários de código para localizar as seções do código que você deve modificar para o tutorial que você está seguindo.

Se você tentar executar o código sem fazer alterações, encontrará um erro de conexão.

Para cada tutorial, você deve substituir o espaço reservado da connection string de conexão pela string de conexão do seu sistema. Para saber como localizar a connection string do seu sistema, consulte Criar uma connection string.

Por exemplo, se sua string de conexão for "mongodb+srv://mongodb-example:27017", sua atribuição de string de conexão será semelhante à seguinte:

uri = "mongodb+srv://mongodb-example:27017";

Para executar o arquivo completo após modificar o modelo de um tutorial, execute o seguinte comando em seu shell:

python3 agg_tutorial.py

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.