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 联表查询的使用方法,涵盖了多表关联查询、多个集合关联查询、筛选匹配的结果以及显示指定字段等内容,希望能够帮助到大家。