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 driver Node.js para construir um pipeline de agregação, executar a agregação em uma collection e imprimir os resultados concluindo e executando um aplicativo de amostra.
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 Aggregation Template App para configurar um aplicação Node.js de trabalho.
Após configurar a aplicação, acesse a collection products
e orders
adicionando o seguinte código à aplicação:
const productsColl = aggDB.collection("products"); const ordersColl = aggDB.collection("orders");
Exclua quaisquer dados existentes e insira dados de amostra na coleção products
como mostrado no seguinte código:
await productsColl.deleteMany({}); const productsData = [ { 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", }, ]; await productsColl.insertMany(productsData);
Exclua quaisquer dados existentes e insira dados de amostra na coleção orders
como mostrado no seguinte código:
await ordersColl.deleteMany({}); const orderData = [ { customer_id: "elise_smith@myemail.com", orderdate: new Date("2020-05-30T08:35:52Z"), product_name: "Asus Laptop", product_variation: "Standard Display", value: 431.43, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2019-05-28T19:13:32Z"), product_name: "The Day Of The Triffids", product_variation: "2nd Edition", value: 5.01, }, { customer_id: "oranieri@warmmail.com", orderdate: new Date("2020-01-01T08:25:37Z"), product_name: "Morphy Richards Food Mixer", product_variation: "Deluxe", value: 63.13, }, { customer_id: "jjones@tepidmail.com", orderdate: new Date("2020-12-26T08:55:46Z"), product_name: "Asus Laptop", product_variation: "Standard Display", value: 429.65, }, ]; await ordersColl.insertMany(orderData);
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 collection orders
à collection products
por dois campos em cada collection. O estágio de pesquisa contém um pipeline incorporado para configurar a uniã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:
const embedded_pl = []; embedded_pl.push({ $match: { $expr: { $and: [ { $eq: ["$product_name", "$$prdname"] }, { $eq: ["$product_variation", "$$prdvartn"] }, ], }, }, });
No pipeline incorporado, adicione outro estágio $match para corresponder aos pedidos feitos em 2020:
embedded_pl.push({ $match: { orderdate: { $gte: new Date("2020-01-01T00:00:00Z"), $lt: new Date("2021-01-01T00:00:00Z"), }, }, });
No pipeline incorporado, adicione um estágio $unset para remover campos desnecessários do lado da coleção orders
da união:
embedded_pl.push({ $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.push({ $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.push({ $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 resultado:
pipeline.push({ $unset: ["_id", "description"], });
Executar o pipeline de agregação
Adicione o seguinte código ao final do seu aplicativo para executar a aggregation na collection products
:
const aggregationResult = await productsColl.aggregate(pipeline);
Por fim, execute o seguinte comando em seu shell para iniciar seu aplicativo:
node agg_tutorial.js
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: 2020-05-30T08:35:52.000Z, value: 431.43 }, { customer_id: 'jjones@tepidmail.com', orderdate: 2020-12-26T08:55:46.000Z, value: 429.65 } ] } { name: 'Morphy Richards Food Mixer', variation: 'Deluxe', category: 'KITCHENWARE', orders: [ { customer_id: 'oranieri@warmmail.com', orderdate: 2020-01-01T08:25:37.000Z, 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 união de vários campos concluído no Github.