MongoDB中多表关联查询JOIN操作$lookup使用教程

业余杂谈 herman 2307浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

MongoDB 是一个 NoSQL 数据库,NoSQL 的最大缺点就是 Join 查询不好操作。NoSQL 并不是说它不是一个 SQL,而是一个 not only sql,不仅仅是一个 SQL。那么在 Mongo 中如何进行多表 Join 查询呢?今天我们就一起来学习学习!

在 MongoDB 中,多表关联查询,有多种方式。今天我们先来学习 $lookup 的使用,它支持两表以上,3 表(集合)等都可以,$lookup 相当于左连接查询。

$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 的用法,我们后面再专门写文章来学习!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » MongoDB中多表关联查询JOIN操作$lookup使用教程