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 $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.

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 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