Junção um para um
Nesta página
- Introdução
- Resumo da tarefa de agregação
- Antes de começar
- Tutorial
- Adicione um estágio de correspondência para pedidos em 2020
- Adicionar um estágio de pesquisa para vincular a collection
- Adicione estágios de conjunto para criar novos campos de documento
- 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 realiza uma junção de um para um. Uma união um a um ocorre quando um documento em uma collection tem um valor de campo que corresponde a um único documento em outra collection que tem o mesmo valor de campo. A agregação corresponde a esses documentos no valor do campo e combina informações de ambas as fontes em um resultado.
Dica
Uma união de um para um não exige que os documentos tenham um relacionamento de um para um. Para saber mais sobre esse relacionamento de dados, veja o Wikipedia sobre Um-para-um (modelo de dados).
Resumo da tarefa de agregação
Este tutorial demonstra como combinar dados de uma collection que descreve informações do produto com outra collection que descreve solicitações de clientes. Os resultados mostram uma lista de todos os pedidos feitos em 2020 que inclui os detalhes do produto associados a cada pedido.
Este exemplo utiliza duas collection:
orders
: contém documentos que descrevem pedidos individuais de produtos em uma lojaproducts
: contém documentos que descrevem os produtos que uma loja vende
Um pedido só pode conter um produto, portanto, a agregação usa uma união de um para um para corresponder um documento do pedido ao documento do produto. As collection são unidas por um campo chamado product_id
que existe em documento de ambas as collection.
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 orders
e products
adicionando o seguinte código à aplicação:
const ordersColl = aggDB.collection("orders"); const productsColl = aggDB.collection("products");
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_id: "a1b2c3d4", value: 431.43, }, { customer_id: "tj@wheresmyemail.com", orderdate: new Date("2019-05-28T19:13:32Z"), product_id: "z9y8x7w6", value: 5.01, }, { customer_id: "oranieri@warmmail.com", orderdate: new Date("2020-01-01T08:25:37Z"), product_id: "ff11gg22hh33", value: 63.13, }, { customer_id: "jjones@tepidmail.com", orderdate: new Date("2020-12-26T08:55:46Z"), product_id: "a1b2c3d4", value: 429.65, }, ]; await ordersColl.insertMany(orderData);
Exclua quaisquer dados existentes e insira dados de amostra na coleção products
como mostrado no seguinte código:
await productsColl.deleteMany({}); const productData = [ { id: "a1b2c3d4", name: "Asus Laptop", category: "ELECTRONICS", description: "Good value laptop for students", }, { id: "z9y8x7w6", name: "The Day Of The Triffids", category: "BOOKS", description: "Classic post-apocalyptic novel", }, { id: "ff11gg22hh33", name: "Morphy Richardds Food Mixer", category: "KITCHENWARE", description: "Luxury mixer turning good cakes into great", }, { id: "pqr678st", name: "Karcher Hose Set", category: "GARDEN", description: "Hose + nosels + winder for tidy storage", }, ]; await productsColl.insertMany(productData);
Tutorial
Adicione um estágio de correspondência para pedidos em 2020
Adicione um estágio $match que corresponda aos pedidos feitos em 2020:
pipeline.push({ $match: { orderdate: { $gte: new Date("2020-01-01T00:00:00Z"), $lt: new Date("2021-01-01T00:00:00Z"), }, }, });
Adicionar um estágio de pesquisa para vincular a collection
Em seguida, adicione um estágio $lookup . O estágio $lookup
une o campo product_id
na collection orders
ao campo id
na collection products
:
pipeline.push({ $lookup: { from: "products", localField: "product_id", foreignField: "id", as: "product_mapping", }, });
Adicione estágios de conjunto para criar novos campos de documento
Em seguida, adicione dois estágios $set ao pipeline.
O primeiro estágio $set
define o campo product_mapping
como o primeiro elemento no objeto product_mapping
criado no estágio $lookup
anterior.
O segundo estágio $set
cria dois novos campos, product_name
e product_category
, a partir dos valores no campo de objeto product_mapping
:
pipeline.push( { $set: { product_mapping: { $first: "$product_mapping" }, }, }, { $set: { product_name: "$product_mapping.name", product_category: "$product_mapping.category", }, } );
Dica
Como esta é uma união um-para-um, o estágio $lookup
adiciona apenas um elemento de array ao documento de entrada. O pipeline usa o operador $first para recuperar os dados desse elemento.
Adicione um estágio não definido para remover campos desnecessários
Finalmente, adicione um estágio $unset . A etapa $unset
remove campos desnecessários do documento:
pipeline.push({ $unset: ["_id", "product_id", "product_mapping"] });
Interpretar resultados
O resultado agregado contém três documentos. Os documentos representam pedidos de clientes que ocorreram em 2020, com o product_name
e product_category
do produto pedido:
{ customer_id: 'elise_smith@myemail.com', orderdate: 2020-05-30T08:35:52.000Z, value: 431.43, product_name: 'Asus Laptop', product_category: 'ELECTRONICS' } { customer_id: 'oranieri@warmmail.com', orderdate: 2020-01-01T08:25:37.000Z, value: 63.13, product_name: 'Morphy Richardds Food Mixer', product_category: 'KITCHENWARE' } { customer_id: 'jjones@tepidmail.com', orderdate: 2020-12-26T08:55:46.000Z, value: 429.65, product_name: 'Asus Laptop', product_category: 'ELECTRONICS' }
O resultado consiste em documentos que contêm campos de documentos na collection orders
e na collection products
, unidos pela correspondência do campo product_id
presente em cada documento original.
Para visualizar o código completo deste tutorial, consulte a Aplicação de Participação Um-para- Um Concluída no Github.