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