MongoDB联表查询用法实战

1. MongoDB联表查询简介

MongoDB作为一款非关系型数据库,一直以来都饱受着关系型数据库用户的诟病,一个重要原因就是 MongoDB 的某些操作不够友好,比如对于联表查询的支持不够好,这也是很多关系型数据库用户被困扰的问题。不过随着 MongoDB 版本的更新,其对于联表查询的支持也越来越好了。

2. MongoDB联表查询实践

2.1 多表关联查询

在 MongoDB 中,多表关联查询的方式是通过 $lookup 操作符来实现的,具体的语法如下:

db.collection.aggregate(

[

{

$lookup:

{

from: ,

localField: ,

foreignField: ,

as:

}

}

]

)

其中,参数的含义如下:

from:要关联的集合名字

localField:当前集合的关联字段

foreignField:要关联的集合的关联字段

as:输出的文档中要包含的新字段的名字

下面,我们通过一个例子来看看 $lookup 的具体使用方法。

我们有两个集合:orders(订单信息)和 products(商品信息),orders 集合中包含了商品编号,我们需要从 products 集合中查询出商品名称(产品名称),两个集合之间可以通过商品编号进行关联查询。

首先,我们需要在 orders 集合中添加商品编号。

db.orders.updateMany(

{},

{$set: {"product_id": ObjectId()}}

)

接着,我们就可以通过 $lookup 来实现关联查询了。

db.orders.aggregate([

{

$lookup:

{

from: "products",

localField: "product_id",

foreignField: "_id",

as: "product_info"

}

}

])

这里将 orders 中的 product_id 与 products 中的 _id 进行了关联,用数组 product_info 存储了产品信息。

2.2 多个集合关联查询

在实际应用中,我们往往需要关联多个集合,这时候可以通过多次使用 $lookup 来实现。

以订单详情与商品详情关联查询为例,使用以下代码:

db.orders.aggregate([

{

$lookup:

{

from: "products",

localField: "product_id",

foreignField: "_id",

as: "product_info"

}

},

{

$unwind: "$order_details"

},

{

$lookup:

{

from: "shop",

localField: "shop_id",

foreignField: "_id",

as: "shop_info"

}

}

])

其中 $unwind 用于平展数组,我们可以通过该操作符将 order_details 数组拆开。

2.3 筛选匹配的结果

在联表查询时,我们可能需要筛选出匹配特定条件的结果。在 MongoDB 中,我们可以使用 $match 操作符来实现这个过程。

以订单详情和商品详情关联查询为例,我们可以通过以下代码来筛选出商品数量大于等于5的订单详情:

db.orders.aggregate([

{

$lookup:

{

from: "products",

localField: "product_id",

foreignField: "_id",

as: "product_info"

}

},

{

$unwind: "$order_details"

},

{

$lookup:

{

from: "shop",

localField: "shop_id",

foreignField: "_id",

as: "shop_info"

}

},

{

$match: {

"order_details.product_count": {$gte: 5}

}

}

])

在 $match 中指定了要筛选的条件,即 order_details 中的 product_count 大于等于 5。

2.4 显示指定字段

在联表查询时,可能我们并不需要将所有关联的字段都显示出来,可以通过指定要显示的字段来实现。

以订单详情和商品详情关联查询为例,我们只需要输出商品名称(产品名称)和商品价格(单价):

db.orders.aggregate([

{

$lookup:

{

from: "products",

localField: "product_id",

foreignField: "_id",

as: "product_info"

}

},

{

$unwind: "$order_details"

},

{

$lookup:

{

from: "shop",

localField: "shop_id",

foreignField: "_id",

as: "shop_info"

}

},

{

$match: {

"order_details.product_count": {$gte: 5}

}

},

{

$project: {

"product_info.name": 1,

"product_info.price": 1

}

}

])

$project 用于指定要显示的字段,这里我们只显示了 product_info 的 name 和 price。

3. 结语

本文主要介绍了 MongoDB 联表查询的使用方法,涵盖了多表关联查询、多个集合关联查询、筛选匹配的结果以及显示指定字段等内容,希望能够帮助到大家。

数据库标签