Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

减少 $lookup 操作

在此页面上

  • 关于此任务
  • 例子
  • 了解详情

$lookup操作符将多个集合中的信息连接到单个文档中。 虽然$lookup操作在不经常使用时很有用,但与仅查询单个集合的操作相比,它可能很慢且耗费大量资源。 如果经常使用$lookup操作,请考虑重组模式以存储相关数据存储在单个集合中。 这可以提高查询性能并降低操作费用。

请考虑以下具有两个独立集合的模式: productsorders 。 每个订单可以包含多个产品,并且您希望追踪每个订单中的产品详细信息以便快速访问权限。 这两个单独的集合通过$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
}
] )

在此模式中,每次访问权限订单信息时都需要使用$lookup操作。 运行$lookup操作会增加查询复杂性并降低性能。 要减少$lookup操作的使用,存储一起访问的数据存储在单个集合中。

您可以使用子集模式设计模式将产品详细信息的子集嵌入orders集合中。 这样,您就可以查询单个集合以返回所需的结果。 与orders集合无关的产品详细信息和文档保留在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."
}
] )

这种方法可以将product集合中的关键字段嵌入到orders集合中,从而保持集合独立,同时避免多次查询。 这提高了读取性能并简化了数据检索,因为您可以在单个查询中访问权限所有必要的信息。 但是,请务必考虑潜在的文档大小限制和数据重复。

后退

臃肿的文档