MongoDB Aggregation pipelines(聚合管道)之 $lookup

$lookup

简单连接的语法结构

{
   $lookup:
     {
       from: <collection to join>,
       localField: <field from the input documents>,
       foreignField: <field from the documents of the "from" collection>,
       as: <output array field>
     }
}

简单连接的参数解释

语法值 解释说明
from 同一个数据库下等待被连接的集合。
localField 源集合中的属性名。如果源集合中,某文档没有localField指定的属性,默认会把该属性的值当做null处理。
foreignField 被连接的集合的属性名。如果被连接的集合中,某文档没有localField指定的字段,默认会把该属性的值当做null来处理。
as 连接后给被连接的集合数组命名。如果输入的集合中已存在该值,则会覆盖。

简单连接的使用示例

1.构造测试数据

// 构造班级数据
db.class0.insertMany([
    {"name": "一年级一班","headmaster": "王老师"},
    {"name": "一年级二班","headmaster": "刘老师"},
    {"name": "一年级三班","headmaster": "李老师"}
]);

// 获取班级的主键
var classesIds = db.class0.find({},{"_id": 1})
// 构造学生的数据
var studentes = [];
for(var i = 0; i < classesIds.length(); i++){
   // 每个班三个学生
   for(var j = 0; j < 3; j++){
        studentes.push({"name": "学生" + j, "classesId": classesIds[i]._id})
    }
}
// 插入学生数据
db.student.insertMany(studentes);
请添加图片描述

2.使用$lookup连接查询

// 班级连接学生
db.class0.aggregate([
    {
        "$lookup": {
            "from": "student",
            "localField": "_id",
            "foreignField": "classesId",
            "as": "stus"
        }
    }
])
请添加图片描述
// 学生连接班级
db.student.aggregate([
    {
        "$lookup": {
            "from": "class0",
            "localField": "classesId",
            "foreignField": "_id",
            "as": "classes"
        }
    }
])
请添加图片描述
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容