Menu Docs

Descompactar arrays e grupo

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:

  • Desencadeia um campo de array em documentos separados

  • 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 criar insights a partir de dados de pedido de cliente. Os resultados mostram a lista de produtos pedidos que custam mais de US$ 15, e cada documento contém o número de unidades vendidas e o valor total de venda de cada produto.

Este exemplo utiliza uma coleção, orders , que contém documentos que descrevem pedidos de produtos. Como cada pedido contém vários produtos, a primeira etapa da agregação é descompactar a array products em documentos de pedido de produto individual.

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 = [
{
"order_id": 6363763262239,
"products": [
{
"prod_id": "abc12345",
"name": "Asus Laptop",
"price": 431,
},
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 22,
},
]
},
{
"order_id": 1197372932325,
"products": [
{
"prod_id": "abc12345",
"name": "Asus Laptop",
"price": 429,
}
]
},
{
"order_id": 9812343774839,
"products": [
{
"prod_id": "pqr88223",
"name": "Morphy Richards Food Mixer",
"price": 431,
},
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 21,
}
]
},
{
"order_id": 4433997244387,
"products": [
{
"prod_id": "def45678",
"name": "Karcher Hose Set",
"price": 23,
},
{
"prod_id": "jkl77336",
"name": "Picky Pencil Sharpener",
"price": 1,
},
{
"prod_id": "xyz11228",
"name": "Russell Hobbs Chrome Kettle",
"price": 16,
}
]
}
]
orders_coll.insert_many(order_data)
1

Primeiro, adicione um estágio $unwind para separar as entradas na array products em documentos individuais:

pipeline.append({
"$unwind": {
"path": "$products"
}
})
2

Em seguida, adicione um estágio $match que corresponda a produtos com um valor de products.price maior que 15:

pipeline.append({
"$match": {
"products.price": {
"$gt": 15
}
}
})
3

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

  • product: o nome do produto

  • total_value: o valor total de todas as vendas do produto

  • quantity: o número de pedidos do produto

pipeline.append({
"$group": {
"_id": "$products.prod_id",
"product": {"$first": "$products.name"},
"total_value": {"$sum": "$products.price"},
"quantity": {"$sum": 1}
}
})
4

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

pipeline.append({
"$set": {
"product_id": "$_id"
}
})
5

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

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

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
7

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

{
'product': 'Asus Laptop',
'total_value': 860,
'quantity': 2,
'product_id': 'abc12345'
}
{
'product': 'Morphy Richards Food Mixer',
'total_value': 431,
'quantity': 1,
'product_id': 'pqr88223'
}
{
'product': 'Russell Hobbs Chrome Kettle',
'total_value': 16,
'quantity': 1,
'product_id': 'xyz11228'
}
{
'product': 'Karcher Hose Set',
'total_value': 66,
'quantity': 3,
'product_id': 'def45678'
}

Os documentos de resultado contêm detalhes sobre o valor total e a quantidade de pedidos de produtos que custam mais de US$ 15.

Para visualizar o código completo deste tutorial, consulte o Aplicativo de Descompactação de Arrays Concluído no Github Github.