Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ /

Reduzir operações $lookup

Nesta página

  • Sobre esta tarefa
  • Exemplo
  • Saiba mais

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.

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.

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.

Voltar

Documentos inchados