减少 $lookup 操作
$lookup
操作符将多个集合中的信息连接到单个文档中。 虽然$lookup
操作在不经常使用时很有用,但与仅查询单个集合的操作相比,它可能很慢且耗费大量资源。 如果经常使用$lookup
操作,请考虑重组模式以存储相关数据存储在单个集合中。 这可以提高查询性能并降低操作费用。
关于此任务
请考虑以下具有两个独立集合的模式: products
和orders
。 每个订单可以包含多个产品,并且您希望追踪每个订单中的产品详细信息以便快速访问权限。 这两个单独的集合通过$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
集合中,从而保持集合独立,同时避免多次查询。 这提高了读取性能并简化了数据检索,因为您可以在单个查询中访问权限所有必要的信息。 但是,请务必考虑潜在的文档大小限制和数据重复。