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集合的匹配文档。 - 如果没有找到匹配项,该数组将为空。
通过这种方式,你可以在不改变数据存储结构的前提下,实现跨集合的复杂数据汇总与展示。