Menu Docs

Página inicial do DocsDesenvolver aplicaçõesDrivers PythonPyMongo

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

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).

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 vende

  • orders, 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 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)
1

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"
}
})
2

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": []}
}
})
3

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"]
})
4

Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection products :

aggregation_result = products_coll.aggregate(pipeline)

Por fim, execute o seguinte comando em seu shell para iniciar seu aplicativo:

python3 agg_tutorial.py
5

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.

← Junção um para um