Acerca de esta tarea
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.
Ejemplo
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.