Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Reducción de las operaciones de $lookup

La El operador $lookup combina información de múltiples colecciones en un solo documento. Aunque la operación $lookup resulta útil cuando se utiliza esporádicamente, puede ser lenta y consumir muchos recursos en comparación con las operaciones que solo consultan una sola colección. Si a menudo usas $lookup operaciones, considera reestructurar tu esquema para almacenar datos relacionados en una única colección. Esto puede mejorar el rendimiento de las query y reducir el costo de las operaciones.

Considera el siguiente esquema con dos colecciones separadas: products y orders. Cada Pedido puede contener múltiples productos, y se desea rastrear los detalles del Producto dentro de cada Pedido para un acceso rápido. Las dos colecciones separadas se unen mediante una operación $lookup.

//products collection
db.products.insertMany( [
{
_id: 1,
name: "Laptop",
price: 1000,
manufacturer: "TechCorp",
category: "Electronics",
description: "Fastest computer on the market."
},
{
_id: 2,
name: "Headphones",
price: 100,
manufacturer: "Sound",
category: "Accessories",
description: "The latest sound technology."
},
{
_id: 3,
name: "Tablet",
price: 200,
manufacturer: "TechCorp",
category: "Electronics",
description: "The most compact tablet."
}
] )
//orders collection
db.orders.insertMany( [
{
_id: 101,
customer_name: "John Doe",
timestamp: "2024-05-11T010:00:00Z",
product_ids: [1, 2],
total: 1200
},
{
_id: 102,
customer_name: "Jane Smith",
timestamp: "2024-05-11T012:00:00Z",
product_ids: [2],
total: 100
}
] )

En este esquema es necesario utilizar la operación $lookup cada vez que se accede a la información de pedidos. Ejecutar la operación $lookup añade complejidad a la query y degrada el rendimiento. Para reducir el uso de las operaciones $lookup, almacene los datos a los que se accede juntos en una sola colección.

Puedes usar el patrón de diseño de esquema de subgrupo para insertar un subgrupo de detalles del producto en la colección orders. Esto te permite hacer una query a una sola colección para devolver los resultados requeridos. Los detalles del producto y los documentos que no son relevantes para la colección orders permanecen en la colección products.

//orders collection
db.orders.insertMany( [
{
_id: 101,
customer_name: "John Doe",
timestamp: "2024-05-11T10:00:00Z",
products: [
{
product_id: 1,
name: "Laptop",
price: 1000
},
{
product_id: 2,
name: "Headphones",
price: 100
}
],
total: 1100
},
{
_id: 102,
customer_name: "Jane Smith",
timestamp: "2024-05-11T12:00:00Z",
products: [
{
product_id: 2,
name: "Headphones",
price: 100
}
],
total: 100
}
] )
//products collection
db.products.insertMany( [
{
_id: 1,
name: "Laptop",
price: 1000,
manufacturer: "TechCorp",
category: "Electronics",
description: "Fastest computer on the market."
},
{
_id: 2,
name: "Headphones",
price: 100,
manufacturer: "Sound",
category: "Accessories",
description: "The latest sound technology."
},
{
_id: 3,
name: "Tablet",
price: 200,
manufacturer: "TechCorp",
category: "Electronics",
description: "The most compact tablet."
}
] )

Este enfoque te permite mantener las colecciones separadas y al mismo tiempo evitar múltiples consultas al incrustar campos clave de la colección product en la colección orders. Esto mejora el rendimiento de lectura y simplifica la recuperación de datos, ya que se puede acceder a toda la información necesaria en una única query. Sin embargo, es importante considerar las posibles limitaciones de tamaño de los documentos y la duplicación de datos.

Volver

Documentos sobredimensionados

Obtén una insignia de habilidad

Domine "Patrones y antipatrones avanzados de esquemas" de forma gratuita.

Más información

En esta página