在MongoDB中怎么联表查询

900 阅读1分钟

在MongoDB中,联表查询可以通过使用聚合管道(Aggregation Pipeline)实现。聚合管道提供了一种强大的方式来处理多个文档,并将它们组合起来以生成所需的结果。

下面是一个使用聚合管道(Aggregation Pipeline)来实现联表查询的示例:

假设我们有两个集合,一个是orders,另一个是customersorders集合中存储了所有的订单信息,包括订单号、客户ID、订单日期和订单总额等。customers集合中存储了所有客户的信息,包括客户ID、姓名、地址和联系方式等。

我们想要查询所有订单的详细信息,并且包含每个订单所属的客户的姓名。为了实现这个查询,我们需要按以下步骤进行:

  1. 使用 $lookup 进行连接操作,将orderscustomers两个集合连接起来。$lookup可以将两个集合中符合条件的文档进行关联,生成一个新的文档数组,并将其作为原始文档的一个字段。
db.orders.aggregate([
   {
      $lookup:
         {
           from: "customers",
           localField: "customer_id",
           foreignField: "_id",
           as: "customer_info"
         }
   }
])

在上面的聚合管道中,$lookuporderscustomers两个集合连接起来,并将连接结果存储在一个名为customer_info的新字段中。其中,localField指定了orders集合中用于连接的字段,foreignField指定了customers集合中用于连接的字段,as指定了连接结果在原始文档中的新字段名。

  1. 使用 $unwind 操作将连接结果展开,将customer_info字段中的所有文档展开成单独的文档。
db.orders.aggregate([
   {
      $lookup:
         {
           from: "customers",
           localField: "customer_id",
           foreignField: "_id",
           as: "customer_info"
         }
   },
   {
      $unwind: "$customer_info"
   }
])

在上面的聚合管道中,$unwind操作将customer_info字段中的所有文档展开成单独的文档。

  1. 使用 $project 操作筛选出所需的字段,包括订单信息和客户姓名。
db.orders.aggregate([
   {
      $lookup:
         {
           from: "customers",
           localField: "customer_id",
           foreignField: "_id",
           as: "customer_info"
         }
   },
   {
      $unwind: "$customer_info"
   },
   {
      $project:
         {
           _id: 1,
           order_date: 1,
           total_amount: 1,
           "customer_info.name": 1
         }
   }
])

在上面的聚合管道中,$project操作筛选出了订单的_idorder_datetotal_amount字段,以及客户的name字段