MongoDB 是一个 NoSQL 数据库,NoSQL 的最大缺点就是 Join 查询不好操作。NoSQL 并不是说它不是一个 SQL,而是一个 not only sql,不仅仅是一个 SQL。那么在 Mongo 中如何进行多表 Join 查询呢?今天我们就一起来学习学习!
在 MongoDB 中,多表关联查询,有多种方式。今天我们先来学习 $lookup 的使用,它支持两表以上,3 表(集合)等都可以,$lookup 相当于左连接查询。

NoSQL != No JOIN。NoSQL 并不代表不能 JOIN 操作。
我有一个 order 集合,还有一个 user 集合,还有一个 product 集合。或者把它们称为表,都可以,叫法随便。下面是我为了讲清楚 $lookup 的用法,所用的测试数据!
db.product.insert({"_id":1,"productname":"商品1","price":15});
db.product.insert({"_id":2,"productname":"商品2","price":36});
db.order.insert({"_id":1,"pid":1,"ordername":"订单1","uid":1});
db.order.insert({"_id":2,"pid":2,"ordername":"订单2","uid":2});
db.order.insert({"_id":3,"pid":2,"ordername":"订单3","uid":2});
db.order.insert({"_id":4,"pid":1,"ordername":"订单4","uid":1});
db.user.insert({"_id":1,"username":1});
db.user.insert({"_id":2,"username":2});
db.product.find();
db.order.find();
db.user.find();
$lookup 两表关联join
看下面的查询语句:
db.product.aggregate([
{
$lookup:
{
from: "order",
localField: "_id",
foreignField: "pid",
as: "inventory_docs"
}
}
]);
执行的结果如下所示,只列了一条数据:
{
"_id" : 1.0,
"productname" : "商品1",
"price" : 15.0,
"inventory_docs" : [
{
"_id" : 1.0,
"pid" : 1.0,
"ordername" : "订单1"
},
{
"_id" : 4.0,
"pid" : 1.0,
"ordername" : "订单4"
}
]
}
lookup 就是使用 aggregate 的 $lookup 属性,$lookup 操作需要一个四个参数的对象,该对象的属性解释如下:
- localField:在输入文档中的查找字段
- from:需要连接的集合
- foreignField:需要在from集合中查找的字段
- as:输出的字段名字
在输出的结果中,会包含一个 inventory_docs 的字段,它会把 order 中所关联的数据在数组中展现。
$lookup 三表关联join
$lookup 的三表关联查询很简单,只需要配置两个 $lookup 即可。具体查询代码如下:
db.order.aggregate([{
$lookup:
{
from: "product",
localField: "pid",
foreignField: "_id",
as: "inventory_docs"
}
},{
$lookup:
{
from: "user",
localField: "uid",
foreignField: "_id",
as: "user_docs"
}
}]);
其实除了 $lookup,populate 也可以用来进行关联查询,这个 populate 的用法,我们后面再专门写文章来学习!

: » MongoDB中多表关联查询JOIN操作$lookup使用教程
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/252777.html