Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Realice uniones de varios campos

Este tutorial ilustra cómo construir un pipeline de agregación, realizar la agregación en una colección y mostrar los resultados utilizando el lenguaje que elijas.

Este tutorial demuestra cómo combinar datos de una colección que describe información de productos con otra colección que describe pedidos de clientes. Los resultados muestran una lista de productos solicitados en 2020 y detalles sobre cada pedido.

Esta agregación realiza una unión de varios campos utilizando $lookup. Una unión de varios campos ocurre cuando hay varios campos correspondientes en los documentos de dos colecciones. La agregación compara estos documentos en los campos correspondientes y combina la información de ambos en un solo documento.


➤ Usar el menú desplegable Seleccionar lenguaje en la parte superior derecha para establecer el lenguaje de los siguientes ejemplos o seleccionar MongoDB Shell.


Este ejemplo utiliza dos colecciones:

  • products, que contiene documentos que describen los productos que vende una tienda

  • orders, que contiene documentos que describen pedidos individuales de productos en una tienda

Una orden sólo puede contener un producto. La agregación utiliza una unión de múltiples campos para emparejar un documento de producto con documentos que representan pedidos de ese producto. La agregación une colecciones por los campos name y variation en los documentos de la colección products, correspondientes a los campos product_name y product_variation en los documentos de la colección orders.

Para crear las colecciones orders y products, utiliza el método insertMany():

db.orders.insertMany( [
{
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,
}
] )
db.products.insertMany( [
{
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"
}
] )

Los siguientes pasos demuestran cómo crear y ejecutar un pipeline de agregación para unir colecciones en múltiples campos.

1

La primera etapa del pipeline es una etapa de $lookup para unir la colección orders con la colección products por dos campos en cada colección. La etapa $lookup contiene un pipeline integrado para configurar la unión.

embedded_pl = [
// Stage 1: Match the values of two fields on each side of the join
// The $eq filter uses aliases for the name and variation fields set
{ $match: {
$expr: {
$and: [
{ $eq: ["$product_name", "$$prdname"] },
{ $eq: ["$product_variation", "$$prdvartn"] }
]
}
} },
// Stage 2: Match orders placed in 2020
{ $match: {
orderdate: {
$gte: new Date("2020-01-01T00:00:00Z"),
$lt: new Date("2021-01-01T00:00:00Z")
}
} },
// Stage 3: Remove unneeded fields from the orders collection side of the join
{ $unset: ["_id", "product_name", "product_variation"] }
]
2
db.products.aggregate( [
// Use the embedded pipeline in a lookup stage
{ $lookup: {
from: "orders",
let: {
prdname: "$name",
prdvartn: "$variation"
},
pipeline: embedded_pl,
as: "orders"
} },
// Match products ordered in 2020
{ $match: { orders: { $ne: [] } } },
// Remove unneeded fields
{ $unset: ["_id", "description"] }
] )
3

Los resultados agregados contienen dos documentos. Los documentos representan productos ordenados 2020. Cada documento contiene un campo arreglo orders que enumera los detalles sobre cada pedido de ese producto.

{
name: 'Asus Laptop',
variation: 'Standard Display',
category: 'ELECTRONICS',
orders: [
{
customer_id: 'elise_smith@myemail.com',
orderdate: ISODate('2020-05-30T08:35:52.000Z'),
value: 431.43
},
{
customer_id: 'jjones@tepidmail.com',
orderdate: ISODate('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: ISODate('2020-01-01T08:25:37.000Z'),
value: 63.13
}
]
}
Califique esta página