Página inicial do Docs → Desenvolver aplicações → Drivers Python → PyMongo
Junção de vários campos
Nesta página
- Introdução
- Resumo da tarefa de agregação
- Antes de começar
- Tutorial
- Adicione um estágio de pesquisa para vincular as collection e importar campo
- Adicione um estágio de correspondência para produtos pedidos em 2020
- 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 aggregation executa uma junção de vários campos. Uma união de vários campos ocorre quando há vários campos correspondentes nos documentos de duas collections que você usa para combinar documentos. A agregação corresponde a esses documentos nos valores de campo e combina informações de ambos em um documento.
Dica
Uniões de um para muitos
Uma união de um para muitos é uma variedade de união de vários campos. Ao realizar uma união um-para-muitos, você seleciona um campo de um documento que corresponde a um valor de campo em vários documentos no outro lado da união. Para saber mais sobre essas relações de dados, consulte as entradas da Wikipedia sobre Um-para-muitos (modelo de dados) e Muitos-para-muitos (modelo de dados).
Resumo da tarefa de agregação
This tutorial demonstrates how to combine data from a collection that describes product information with another collection that describes customer orders. Os resultados mostram uma lista de produtos pedidos em 2020 que também contém detalhes sobre cada pedido.
Este exemplo utiliza duas collection:
products
, que contém documentos que descrevem os produtos que uma loja vendeorders
, que contém documentos que descrevem pedidos individuais de produtos em uma loja
Um pedido só pode conter um produto, portanto, a agregação usa uma união de vários campos para corresponder um documento de produto a documentos que representam pedidos desse produto. As collections são unidas pelos campos name
e variation
em documentos na collection products
, correspondendo aos campos product_name
e product_variation
em documentos na collection orders
.
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.
Após configurar a aplicação, acesse a collection products
e orders
adicionando o seguinte código à aplicação:
products_coll = agg_db["products"] orders_coll = agg_db["orders"]
Exclua quaisquer dados existentes e insira dados de amostra na coleção products
como mostrado no seguinte código:
products_coll.delete_many({}) products_data = [ { "name": "Asus Laptop", "variation": "Ultra HD", "category": "ELECTRONICS", "description": "Great for watching movies" }, { "name": "Asus Laptop", "variation": "Standard Display", "category": "ELECTRONICS", "description": "Good value laptop for students" }, { "name": "The Day Of The Triffids", "variation": "1st Edition", "category": "BOOKS", "description": "Classic post-apocalyptic novel" }, { "name": "The Day Of The Triffids", "variation": "2nd Edition", "category": "BOOKS", "description": "Classic post-apocalyptic novel" }, { "name": "Morphy Richards Food Mixer", "variation": "Deluxe", "category": "KITCHENWARE", "description": "Luxury mixer turning good cakes into great" } ] products_coll.insert_many(products_data)
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), "product_name": "Asus Laptop", "product_variation": "Standard Display", "value": 431.43 }, { "customer_id": "tj@wheresmyemail.com", "orderdate": datetime(2019, 5, 28, 19, 13, 32), "product_name": "The Day Of The Triffids", "product_variation": "2nd Edition", "value": 5.01 }, { "customer_id": "oranieri@warmmail.com", "orderdate": datetime(2020, 1, 1, 8, 25, 37), "product_name": "Morphy Richards Food Mixer", "product_variation": "Deluxe", "value": 63.13 }, { "customer_id": "jjones@tepidmail.com", "orderdate": datetime(2020, 12, 26, 8, 55, 46), "product_name": "Asus Laptop", "product_variation": "Standard Display", "value": 429.65 } ] orders_coll.insert_many(order_data)
Tutorial
Adicione um estágio de pesquisa para vincular as collection e importar campo
O primeiro estágio do pipeline é um estágio $lookup para unir a coleção orders
à coleção products
por dois campo em cada coleção. O estágio de pesquisa contém um pipeline incorporado para configurar a junção.
No pipeline incorporado, adicione um estágio $match para corresponder aos valores de dois campos em cada lado da união. Observe que o código a seguir usa nomes alternativos para os campos name
e variation
definidos ao criar o estágio $lookup
:
embedded_pl = [ { "$match": { "$expr": { "$and": [ {"$eq": ["$product_name", "$$prdname"]}, {"$eq": ["$product_variation", "$$prdvartn"]} ] } } } ]
Dentro do pipeline incorporado, adicione outro estágio $match para corresponder aos pedidos feitos em 2020:
embedded_pl.append({ "$match": { "orderdate": { "$gte": datetime(2020, 1, 1, 0, 0, 0), "$lt": datetime(2021, 1, 1, 0, 0, 0) } } })
No pipeline incorporado, adicione um estágio $unset para remover campos desnecessários do lado da coleção orders
da união:
embedded_pl.append({ "$unset": ["_id", "product_name", "product_variation"] })
Após a conclusão do pipeline incorporado, adicione o estágio $lookup
ao pipeline de agregação principal. Configure este estágio para armazenar os campos de pesquisa processados em um campo de matriz denominado orders
:
pipeline.append({ "$lookup": { "from": "orders", "let": { "prdname": "$name", "prdvartn": "$variation" }, "pipeline": embedded_pl, "as": "orders" } })
Adicione um estágio de correspondência para produtos pedidos em 2020
Em seguida, adicione um estágio $match para mostrar apenas produtos para os quais há pelo menos um pedido em 2020, com base na array orders
calculada na etapa anterior:
pipeline.append({ "$match": { "orders": {"$ne": []} } })
Adicione um estágio não definido para remover campos desnecessários
Finalmente, adicione um estágio $unset. O estágio $unset
remove os campos _id
e description
dos documentos de resultados:
pipeline.append({ "$unset": ["_id", "description"] })
Interpretar resultados
O resultado agregado contém dois documentos. Os documentos representam produtos para os quais houve pedidos feitos em 2020. Cada documento contém um campo de array orders
que lista detalhes sobre cada pedido para esse produto:
{ 'name': 'Asus Laptop', 'variation': 'Standard Display', 'category': 'ELECTRONICS', 'orders': [ { 'customer_id': 'elise_smith@myemail.com', 'orderdate': datetime.datetime(2020, 5, 30, 8, 35, 52), 'value': 431.43 }, { 'customer_id': 'jjones@tepidmail.com', 'orderdate': datetime.datetime(2020, 12, 26, 8, 55, 46), 'value': 429.65 } ] } { 'name': 'Morphy Richards Food Mixer', 'variation': 'Deluxe', 'category': 'KITCHENWARE', 'orders': [ { 'customer_id': 'oranieri@warmmail.com', 'orderdate': datetime.datetime(2020, 1, 1, 8, 25, 37), 'value': 63.13 } ] }
Os documentos de resultado contêm detalhes de documentos na collection orders
e na collection products
, unidas pelos nomes e variações do produto.
Para visualizar o código completo deste tutorial, consulte o aplicativo de junção de vários campos completo no Github.