当需要在已经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,很多语法也还没了解透彻,对于所谓的集合嵌套或者集合引用真的是一窍不通,但是最后还是得实现啊,感谢这位大神的分享,这位大哥的详解真的是十分到位,我终于搞懂了https://www.cnblogs.com/xuliuzai/p/10055535.html
我的实现过程
前期需求:
                                    MongoDB 嵌套结构的数据非常常见, 它通过嵌套文档,达到一对多的关联关系。但嵌套结构中按分类分组求子文档的数据计算,不能直接通过 $group 聚集运算来实现,需要将嵌套结构解开,由多层嵌套结构变成多条单层结构来计算,由于中间过程的处理,且还要借且其它函数辅助实现输出。下面以集合 order 为例说明,按 category 分组获取 term 的数量并按由大到小的顺序输出。
{ category: "movies",
 terms: [{ term: "movie 1", total: ...
                                    这两天做mongodb的多表且多字段关联查询,这里做下使用记录,后续可套用该模式使用。
如果不考虑性能影响的话,可以无限使用 lookup 做多表关联。
多表关联查询的效率比单表加循环查询效率非常高。
let mongoUrl=`mongodb://root:pwd@127.0.0.1:27017/dbName`;//数据库连接
let mongo=require("lycq").mongo;
async function main(){
    console.log("启动")
    let db.
Mongodb 3.2版本新增,主要用来实现多表关联查询, 相当关系型数据库中多表关联查询。
每个输入待处理的文档,经过$lookup 阶段的处理,输出的新文档中会包含一个新生成的数组(可根据需要命名新key )。数组列存放的数据是来自被Join集合的适配文档,如果没有,集合为空(即 为[ ])
二、$lookup的语法
$lookup的语法
db.collection.aggregate([
                                    文章目录一、聚合框架二、 $lookup的功能及语法三、案例
一、聚合框架
聚合框架是MongoDB的高级查询语言,它允许我们通过转换和合并多个文档中的数据来生成新的单个文档中不存在的信息。
聚合管道操作主要包含下面几个部分:
命令	功能描述	备注
$project	 指定输出文档里的字段	
$match	 选择要处理的文档,与fine()类似	
$limit	     限制传递给下一步的文档数量	
$skip	     跳过一定数量的文档	
$unwind	 扩展数组,为每个数组入口生成一个输出文档	
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents ...
                                    简要介绍NOSQLmongoDB 是属于NOSQL.什么是nosql,NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是SQL”。 
NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库数据库管理系统的统称。NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类