MongoDB 中使用 $lookup 进行跨集合查询技巧解析
在 MongoDB 中,$lookup 可以在两个或多个集合之间执行左外连接,非常适合于在多个数据集合之间创建导航结构或创建丰富的查询结果集。$lookup 可以查询多个集合的数据,并将它们合并成一个结果集。在这篇文章中,我们将深入讨论 MongoDB 中使用 $lookup 进行跨集合查询技巧的解析。
- 什么是 $lookup?
$lookup 是 MongoDB 中非常强大和实用的聚合管道操作符之一,可以在多个集合间执行左外连接,以将其返回的文档与该集合中的其他文档匹配。
- $lookup 的基本语法
下面是 $lookup 的基本语法:
db.collection.aggregate([ { $lookup: { from: "collectionName", localField: "fieldName", foreignField: "otherFieldName", as: "alias" } } ]);
- from:必须指定要连接的集合的名称。
- localField:当前集合中要用作匹配的字段。将在此字段中查询一个值。
- foreignField:要从另一个集合中匹配的目标字段。要从包含要匹配的值的集合中检索一个值。
- as: 将查询结果集的别名指定为覆盖原始集合的字段名。
3.使用 $lookup 进行跨集合查询
现在我们将使用 $lookup 进行跨集合查询,请查看以下代码
db.orders.aggregate([ { $lookup: { from: "products", localField: "product_id", foreignField: "_id", as: "product_details" } } ]);
products 数据集:
{ "_id" : "p1", "product_name" : "MacBook Pro", "brand" : "Apple" }, { "_id" : "p2", "product_name" : "Pixel 4", "brand" : "Google" }
orders 数据集:
{ "_id" : "o1", "product_id" : "p1", "order_date" : "2022-05-31", "quantity":2 }, { "_id" : "o2", "product_id" : "p2", "order_date" : "2022-06-05", "quantity":1 }
在上面的例子中,我们正在连接 orders 和 products 集合。我们正在查询 orders 集合,每个文档都有一个 product_id,该 product_id 与 products 集合中的 _id 匹配。通过这种方式,我们可以将 orders 集合与 products 集合进行连接,并返回包含产品详细信息的结果集。
4.利用 $lookup 进行多级查询
在实际工作中,我们通常需要进行多级查询来结合到多个集合中,这时我们将 $lookup 进行嵌套使用。请查看以下代码:
db.sales.aggregate([ { $lookup: { from: "products", localField: "product_id", foreignField: "_id", as: "product_details" } }, { $lookup: { from: "companies", localField: "product_details.manufacturer", foreignField: "_id", as: "manufacturer_details" } } ]);
products 集合:
{ "_id" : "p1", "product_name" : "MacBook Pro", "manufacturer" : "m1" }, { "_id" : "p2", "product_name" : "Pixel 4", "manufacturer" : "m2" }
companies 集合:
{ "_id" : "m1", "company_name" : "Apple Inc.", "headquarters" : "Cupertino, California" }, { "_id" : "m2", "company_name" : "Google LLC", "headquarters" : "Mountain View, California" }
sales 集合:
{ "_id" : "s1", "product_id" : "p1", "sale_date" : "2022-06-01", "sale_amount":2000 }, { "_id" : "s2", "product_id" : "p2", "sale_date" : "2022-06-05", "sale_amount":800 }
在上面的例子中,我们正在连接 sales、products 和 companies 集合。首先,我们使用 $lookup 加入 products 集合,并使用 foreignField 对 _id 进行匹配。我们还将查询结果集中的别名设置为 product_details。之后,我们再次使用 $lookup 来连接 companies 集合。localField 是 product_details.manufacturer(通过 productId 集合与 products 集合相连)和 foreignField 是 companies 集合的 _id。最后,我们将查询结果集中的别名设置为 manufacturer_details。
5.总结
以上是 MongoDB 中使用 $lookup 进行跨集合查询技巧的解析和示例代码,$lookup 可以非常方便地将数据集进行嵌套查询,并丰富了我们的查询结果集。$lookup 不仅适用于普通的单一查询,同时也可以充分利用在多级查询中,非常强大实用。希望这篇文章能够帮助更多的前端工程师更好地理解并掌握 MongoDB 中的 $lookup 操作符。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a1e731add4f0e0ff9ff8a3