MongoDB $lookup

在MongoDB中,$lookup是一个非常有用的集合关联操作符,它用于在一个集合中执行类似于SQL中的join操作。通过$lookup,我们可以实现在多个集合之间进行数据关联查询,并且返回结果作为一个新的文档。
语法
$lookup操作符的语法如下所示:
{
  $lookup: {
    from: <集合名称>,
    localField: <本地字段>,
    foreignField: <外部字段>,
    as: <输出字段>
  }
}
from: 将要连接的集合的名称。localField: 本地要用于关联的字段。foreignField: 外部要用于关联的字段。as: 输出的字段名称,将关联查询结果存储在这个字段中。
示例
假设我们有两个集合:students和grades,其中students中包含学生的信息,grades中包含学生成绩的信息。我们希望将学生成绩和学生信息进行关联查询。
数据准备
首先插入一些示例数据:
// 插入students集合数据
db.students.insertMany([
  { _id: 1, name: "Alice", age: 20 },
  { _id: 2, name: "Bob", age: 21 },
  { _id: 3, name: "Cathy", age: 22 }
])
// 插入grades集合数据
db.grades.insertMany([
  { student_id: 1, score: 85 },
  { student_id: 2, score: 90 },
  { student_id: 3, score: 95 }
])
执行$lookup操作
然后执行$lookup操作来关联students和grades集合:
db.students.aggregate([
  {
    $lookup: {
      from: "grades",
      localField: "_id",
      foreignField: "student_id",
      as: "grades"
    }
  }
])
通过上述操作,我们可以得到如下结果:
[
  {
    "_id": 1,
    "name": "Alice",
    "age": 20,
    "grades": [
      {
        "_id": ObjectId("60c992a1f3c69b3a3ca20a6c"),
        "student_id": 1,
        "score": 85
      }
    ]
  },
  {
    "_id": 2,
    "name": "Bob",
    "age": 21,
    "grades": [
      {
        "_id": ObjectId("60c992a1f3c69b3a3ca20a6d"),
        "student_id": 2,
        "score": 90
      }
    ]
  },
  {
    "_id": 3,
    "name": "Cathy",
    "age": 22,
    "grades": [
      {
        "_id": ObjectId("60c992a1f3c69b3a3ca20a6e"),
        "student_id": 3,
        "score": 95
      }
    ]
  }
]
总结
通过$lookup操作符,在MongoDB中实现了两个集合之间的数据关联查询,从而方便我们在复杂数据场景下获取需要的数据。在实际应用中,$lookup常用于多表关联查询、聚合操作等场景,是MongoDB中非常强大和灵活的功能之一。
极客笔记