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