Descompactar arrays e grupo
Nesta página
- Introdução
- Resumo da tarefa de agregação
- Antes de começar
- Tutorial
- Adicione um estágio de desenrolamento para desempacotar a array de pedidos de produtos
- Adicione um estágio de correspondência para produtos que custam mais de US$ 15
- Adicione um estágio de grupo para agrupar por tipo de produto
- Adicione um estágio de definição para exibir o ID do produto
- 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:
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
Resumo da tarefa de agregação
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
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)
Tutorial
Adicione um estágio de desenrolamento para desempacotar a array de pedidos de produtos
Primeiro, adicione um estágio $unwind para separar as entradas na array products
em documentos individuais:
pipeline.append({ "$unwind": { "path": "$products" } })
Adicione um estágio de correspondência para produtos que custam mais de US$ 15
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 } } })
Adicione um estágio de grupo para agrupar por tipo de produto
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 produtototal_value
: o valor total de todas as vendas do produtoquantity
: 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} } })
Adicione um estágio de definição para exibir o ID do produto
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" } })
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:
{ '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.