在MongoDB中,$lookup
是聚合管道中的一个阶段,用于在两个集合之间执行左外连接。如果你需要在多个级别上进行连接,可以通过嵌套$lookup
来实现。
以下是一个示例,展示了如何在三个集合之间进行多级连接:
假设我们有三个集合:orders
、customers
和countries
。
orders
集合包含订单信息,其中有一个字段customerId
指向customers
集合中的文档。customers
集合包含客户信息,其中有一个字段countryId
指向countries
集合中的文档。orders
{ "_id": 1, "customerId": 101, "product": "Laptop" }
{ "_id": 2, "customerId": 102, "product": "Phone" }
customers
{ "_id": 101, "name": "Alice", "countryId": 201 }
{ "_id": 102, "name": "Bob", "countryId": 202 }
countries
{ "_id": 201, "name": "USA" }
{ "_id": 202, "name": "Canada" }
我们可以使用嵌套的$lookup
来实现多级连接:
db.orders.aggregate([
{
$lookup: {
from: "customers",
localField: "customerId",
foreignField: "_id",
as: "customerInfo"
}
},
{
$unwind: "$customerInfo"
},
{
$lookup: {
from: "countries",
localField: "customerInfo.countryId",
foreignField: "_id",
as: "countryInfo"
}
},
{
$unwind: "$countryInfo"
},
{
$project: {
_id: 1,
product: 1,
customerName: "$customerInfo.name",
countryName: "$countryInfo.name"
}
}
])
$lookup
:customers
集合中查找与orders
集合中的customerId
字段匹配的文档,并将结果存储在customerInfo
字段中。$unwind
:customerInfo
数组,以便每个订单文档都包含一个单独的客户文档。$lookup
:countries
集合中查找与展开后的customerInfo.countryId
字段匹配的文档,并将结果存储在countryInfo
字段中。$unwind
:countryInfo
数组,以便每个订单文档都包含一个单独的国家文档。$project
:{ "_id": 1, "product": "Laptop", "customerName": "Alice", "countryName": "USA" }
{ "_id": 2, "product": "Phone", "customerName": "Bob", "countryName": "Canada" }
通过这种方式,你可以在MongoDB中实现多级连接。根据你的具体需求,可能需要调整字段名称和逻辑。
领取专属 10元无门槛券
手把手带您无忧上云