MongoDB 简明教程

MongoDB $lookup

1. $lookup 阶段简介

$lookup 阶段会对同一数据库中的另一个非分片集合执行左外连接(Left Outer Join)。它能够从“被连接”的集合中抓取匹配的文档并合并到当前结果集中。

2. 语法与参数详解

要在聚合管道中使用 $lookup,你需要遵循特定的对象结构。

2.1 基础语法

{
  $lookup: {
    from: <要连接的集合名称>,
    localField: <输入文档中的关联字段>,
    foreignField: <目标集合中的关联字段>,
    as: <输出的数组字段名称>
  }
}

2.2 参数说明

  • from: 指定要在同一个数据库中执行连接操作的目标集合。
  • localField: 输入到 $lookup 阶段的文档(即当前集合)中的字段。系统会使用此字段的值去匹配目标集合。
  • foreignField: 目标集合(即 from 集合)中的字段。系统会拿它与输入文档的 localField 进行等值匹配。
  • as: 指定新添加的数组字段的名称。如果匹配成功,相关的文档将以数组的形式存储在这个新字段中。

3. 实战示例

假设你有两个集合:orders(订单)和 products(产品)。其中 orders 文档包含 product_id 字段,而 products 文档包含对应的 id 字段。

你可以使用以下代码将订单与其对应的产品详情关联起来:

示例代码

db.orders.aggregate([
  {
    $lookup: {
      from: "products",
      localField: "product_id",
      foreignField: "id",
      as: "order_details"
    }
  }
])

4. 运行结果解析

当你运行上述聚合查询时,MongoDB 会遍历 orders 集合中的每一个文档。对于每一个订单,它会去 products 集合中寻找 id 与订单中 product_id 相匹配的文档。

最终返回的文档中会多出一个名为 order_details 的数组字段:

  • 如果找到匹配项,该数组将包含来自 products 集合的匹配文档。
  • 如果没有找到匹配项,该数组将为空。

通过这种方式,你可以在不改变数据存储结构的前提下,实现跨集合的复杂数据汇总与展示。