Reduzir operações $lookup
Nesta página
O operador $lookup
une informações de várias coleções em um único documento. Embora a operação $lookup
seja útil quando usada com pouca frequência, ela pode ser lenta e consome muitos recursos em comparação com operações que executam query apenas de uma única collection. Se você costuma usar operações $lookup
, considere reestruturar seu esquema para armazenar dados relacionados em uma única collection. Isso pode melhorar o desempenho da query e reduzir o custo das operações.
Sobre esta tarefa
Considere o seguinte esquema com duas collections separadas: products
e orders
. Cada pedido pode conter vários produtos e você deseja acompanhar os detalhes do produto em cada pedido para acesso rápido. As duas collections separadas são unidas por uma operação $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 } ] )
Neste esquema, você precisa usar a operação $lookup
toda vez que acessar as informações do pedido. Executar a operação $lookup
adiciona complexidade à query e degrada o desempenho. Para reduzir o uso de operações do $lookup
, armazene dados que são acessados juntos em uma única coleção.
Exemplo
Você pode utilizar o padrão de design de esquema de subconjunto para incorporar um subconjunto de detalhes do produto na coleção orders
. Isso permite consultar uma única collection para retornar os resultados necessários. Os detalhes e documentos do produto não relevantes para a collection orders
permanecem na collection 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." } ] )
Essa abordagem permite manter as collections separadas e, ao mesmo tempo, evitar várias queries ao incorporar campos principais da collection product
na collection orders
. Isso melhora o desempenho de leitura e simplifica a recuperação de dados, pois você pode acessar todas as informações necessárias em uma única query. No entanto, é importante considerar possíveis limitações de tamanho de documento e duplicação de dados.