当需要在已经lookup的数组集合中,再次lookup,如果直接使用外键和内建这种模式是无法实现的。这种情况需要使用管道模式来单独处理树形复杂结构。
db.student3.aggregate([
{
$lookup:
{
from: 'products2', // 右集合
// localField: 'product_ids', // 左集合 join 字段
//foreignField: '_id', // 右集合 join 字段
let: {
student_products: "$product_ids",
},
pipeline: [
{
// 应该循环匹配
$match: {
$expr:
{
$in: ["$_id", "$$student_products"]
}
}
},
{
$lookup: {
"from": "test_size",
// "localField": "size",
//"foreignField": "_id",
let: {
product_size: "$size",
},
pipeline: [
{
$match: {
$expr:
{
$in: ["$_id", "$$product_size"]
}
}
},
{
$project: {
_id: 0
}
}
],
"as": "size"
}
},
{
$project: {
_id: 0
}
}
],
as: 'order_products' // 新生成字段(类型array)
},
},
{
$project: {
product_ids: 0
}
}
])
输出
{
"_id": ObjectId("61ea7e9da9d1ce8814002d17"),
"name": "雷",
"age": 39,
"order_products": [
{
"name": "笔记本电脑",
"size": [
{
"_id": ObjectId("62315236a9d1ce8b9400075a"),
"name": "1寸"
},
{
"_id": ObjectId("6231523ea9d1ce8b9400075b"),
"name": "2寸"
}
]
},
{
"name": "耳机",
"size": [
{
"_id": ObjectId("6231523ea9d1ce8b9400075b"),
"name": "2寸"
}
]
}
]
}