当需要在已经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寸"
}
]
}
]
}
这篇博客介绍了在MongoDB中如何使用聚合管道(aggregate)处理复杂的树形结构数据,特别是涉及到多次lookup的情况。通过示例展示了如何在已lookup的数组中再次lookup,并通过$match和$in操作符进行条件过滤,以及使用$project进行字段选择,最后生成新的结构化数据。
6179

被折叠的 条评论
为什么被折叠?



