Docs Menu
Docs Home
/ /

Reducción de las operaciones de $lookup

El $lookupEl operador une información de varias colecciones en un solo documento. Si bien la $lookup operación es útil cuando se usa con poca frecuencia, puede ser lenta y consumir muchos recursos en comparación con las operaciones que solo consultan una sola colección. Si usa con frecuencia $lookup operaciones, considere reestructurar su esquema para almacenar datos relacionados en una sola colección. Esto puede mejorar el rendimiento de las consultas y reducir el costo de las operaciones.

Considere el siguiente esquema con dos colecciones independientes: products y orders. Cada pedido puede contener varios productos, y desea realizar un seguimiento de los detalles de cada producto para un acceso rápido. Las dos colecciones independientes 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.

Puede usar el patrón de diseño de esquema de subconjunto para incrustar un subconjunto de detalles de producto en la colección orders. Esto le permite consultar una sola colección para obtener los resultados requeridos. Los detalles de 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 permite mantener las colecciones separadas y evitar múltiples consultas al integrar 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 permite acceder a toda la información necesaria con una sola consulta. Sin embargo, es importante considerar las posibles limitaciones de tamaño del documento 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