$lookup
是 MongoDB 中的一个聚合管道操作符,用于在一个集合中查找与另一个集合中的文档相关联的文档,并将它们合并在一起。
在
$lookup
操作中,可以指定一个
localField
,表示当前集合中的字段名,它将用于在当前集合中查找与另一个集合相关联的文档。另一个集合中的字段可以通过指定
foreignField
来指定。例如:
db.orders.aggregate([
$lookup:
from: "products",
localField: "product_id",
foreignField: "_id",
as: "product"
上面的代码将在 orders
集合中查找所有的订单,然后将每个订单的 product_id
字段与 products
集合中的 _id
字段进行比较,找到与之相关联的商品信息。结果将会将匹配到的商品信息存储在一个新的 product
数组中。
值得注意的是,localField
和 foreignField
都可以是任意字段,只要它们在两个集合之间建立了关联即可。
另外,如果要在当前集合中使用某个字段的子字段来进行查询,可以使用 $lookup
中的 let
和 pipeline
子句来实现。例如:
db.orders.aggregate([
$lookup:
from: "orderDetails",
let: { order_id: "$_id" },
pipeline: [
{ $match:
{ $expr:
{ $eq: [ "$order_id", "$$order_id" ] }
{ $project: { item: 1, price: 1 } }
as: "orderDetails"
上面的代码将在 orders
集合中查找所有的订单,然后将每个订单的 _id
字段存储在 let
变量 order_id
中。接着,在 $lookup
的 pipeline
中使用 $match
来筛选 orderDetails
集合中与当前订单相关联的文档,条件是 order_id
等于 $$order_id
。最后,使用 $project
子句来指定 item
和 price
字段,作为最终结果的一部分。