在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()
})
})
最后得出的结果: