MongoDB中的联合查询($lookup)

2020-05-12  本文已影响0人  技术灭霸

在3.2 之前MongoDB不支持join,其官网上推荐的unity jdbc可以把数据取出来进行二次计算实现join运算,但收费版才有这个功能。其他免费的jdbc drive只能支持最基本的SQL语句,不支持join。

幸运的是MongoDB 3.2 介绍了一个新的$lookup操作,这个操作可以提供一个类似于LEFT OUTER JOIN的操作在两个或者是更多的条件下。

我们现在使用$lookup操作从user集合中连接数据,这个操作需要一个四个参数的对象:
1、from:需要连接的集合
2、localField:在输入文档中的查找字段
3、foreignField:需要在from集合中查找的字段
4、as:输出的字段名字

$lookup:{
                from:'products', //关联查询表2
                localField:'product_id', //关联表1的商品编号ID
                foreignField:'_id',  //匹配表2中的ID与关联表1商品编号ID对应
                as:'orderLists'  //满足 localField与foreignField的信息加入orderlists集合
            }
        

orders表:

{
    "_id" : 1,
    "product_id" : 154,
    "status" : 1
}
 
{
    "_id" : 2,
    "product_id" : 155,
    "status" : 1
}

products表:

{
    "_id" : 154,
    "name" : "笔记本电脑"
}
{
    "_id" : 155,
    "name" : "耳机"
}
{
    "_id" : 156,
    "name" : "台式电脑"
}

来查一下:用的Node.js语法,都大同小异。

const MongoClient = require('mongodb').MongoClient
const url = 'mongodb://localhost:27017';
 
MongoClient.connect(url, { useNewUrlParser: true }, function (err, db) {
    if (err) throw err;
    console.log("runoob库已创建!")
 
    var dbo = db.db("runoob");
    
 
    dbo.collection("orders").aggregate([
        {$lookup:
            {
                from:'products', //关联查询表2
                localField:'product_id', //关联表1的商品编号ID
                foreignField:'_id',  //匹配表2中的ID与关联表1商品编号ID对应
                as:'orderLists'  //满足 localField与foreignField的信息加入orderlists集合
            }
        },
        {$match:{"product_id":154}}//筛选类似与SQL的where
    ]).toArray(function(err,res){
        if(err)throw err;
        console.log(JSON.stringify(res))
        db.close()
    })
   
})

最后得出的结果:


image.png
上一篇下一篇

猜你喜欢

热点阅读